Warum ist es, wenn Sample 1
kompiliert wird, verwendet es alle meine RAM und stürzt mein Computer noch Sample 2
kompiliert sofort, ohne dies zu tun?Extreme Speicherauslastung mit großen Arrays eines Objekts
Probe 1:
class Foo
{
int a = 0;
};
class Test
{
Foo foo[4000000] = {};
};
int main()
{
Test t;
}
Probe 2:
class Foo
{
int a = 0;
};
int main()
{
Foo foo[4000000] = {};
}
Schließlich ist es eine Möglichkeit, Probe 1 von der Verwendung Tonnen RAM zu stoppen beim Kompilieren? Ich benutze gcc version 5.3.0
und ich kompilierte das oben mit -std=c++11
. Beachten Sie, dass class Test
nur 16 MB Speicher benötigen.
Für alle
'es nutzt alle meine RAM und stürzt meinen Computer ab 'Wenn GCC das tut, ist es offensichtlich ein Compiler Bug. – user6412786
Faszinierend. Ich werde raten, dass gcc versucht, einen Konstruktor für das Objekt zu erstellen, indem der Code generiert wird, um jede der vier Millionen Instanzen von "Foo" in der Klasse "Test" zu initialisieren. Weiß nicht, warum gcc das nicht genauso machen kann wie im zweiten Beispiel. P.S. 'class Test' sollte 16 MB Speicher benötigen, 4 Mio. * 4 Bytes pro int. –
Es ist nicht sehr unangemessen, nicht optimierten Code zu generieren und ihn dann zu optimieren. Dies führt jedoch in diesem Fall offensichtlich zu suboptimalen Ergebnissen. –