2016-06-03 13 views
5

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

+0

'es nutzt alle meine RAM und stürzt meinen Computer ab 'Wenn GCC das tut, ist es offensichtlich ein Compiler Bug. – user6412786

+0

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. –

+0

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. –

Antwort

-2

Dies ist definitiv ein Fehler. Ich kann dies mit 5.3 auf meinem System reproduzieren. Die RAM-Nutzung nimmt schnell zu, aber ich habe das Programm geschlossen, weil ich nicht möchte, dass mein System abstürzt. Auf der anderen Seite, wenn ich es in Clang 3.8 kompiliere, kompiliert es fast sofort.

Ich schlage vor, dies an gcc.gnu.org/bugzilla zu melden. Als indicated here werfen Sie einen Blick auf Fehlerberichte 59659, 68203 und 56671. Ich bin ziemlich sicher, dass sie alle auf das gleiche Problem von GCC's Unfähigkeit zeigen, eine große Reihe von nicht-trivialen Klassen zu haben.

+1

"Das ist definitiv ein Fehler". Beweis? –

+0

Auch Sie kopierten im Grunde die Antwort von [this] (http://stackoverflow.com/questions/37260097/stdarray-with-aggregate-initialization-on-g-generates-huge-code) Frage. Bitte geben Sie Kredit, wo Kredit fällig ist. –