2016-06-03 86 views
5

Perché durante la compilazione di Sample 1, viene utilizzata tutta la mia RAM e si arresta in modo anomalo sul computer, senza che compaiano le combinazioni Sample 2 senza farlo?Utilizzo estremo della memoria con matrici di grandi dimensioni di un oggetto

Esempio 1:

class Foo 
{ 
    int a = 0; 
}; 

class Test 
{ 
    Foo foo[4000000] = {}; 
}; 

int main() 
{ 
    Test t; 
} 

Esempio 2:

class Foo 
{ 
    int a = 0; 
}; 

int main() 
{ 
    Foo foo[4000000] = {}; 
} 

Infine, non v'è alcun modo per fermare campione 1 da utilizzare tonnellate di RAM durante la compilazione? Sto usando gcc version 5.3.0 e ho compilato il precedente con -std=c++11. Notare che class Test dovrebbe richiedere solo 16 MB di memoria.

Per qualsiasi

+0

'usa tutta la mia RAM e va in crash nel mio computer' Se GCC lo fa, è ovviamente un bug del compilatore. – user6412786

+0

Affascinante. Immagino che gcc stia tentando di creare un costruttore per l'oggetto generando il codice per inizializzare ciascuna delle quattro milioni di istanze di 'Foo' nella classe' Test'. Non so perché gcc non può farlo nello stesso modo in cui lo fa nel secondo esempio. Post scriptum 'class Test 'dovrebbe richiedere 16 MB di memoria, 4 milioni * 4 byte per int. –

+0

Non è eccessivamente irragionevole generare codice non ottimizzato e quindi ottimizzarlo. Sebbene, ovviamente, ciò produca risultati drammaticamente subottimali in questo caso. –

risposta

-2

Questo è sicuramente un bug. Posso riprodurre questo con 5.3 sul mio sistema. L'utilizzo della RAM aumenta rapidamente, ma ho chiuso il programma perché non voglio che il mio sistema si blocchi. D'altra parte, se lo compilo in Clang 3.8, si compila quasi all'istante.

Suggerisco di segnalarlo a gcc.gnu.org/bugzilla. Come indicated here dai un'occhiata ai bug reports 59659, 68203 e 56671. Sono abbastanza sicuro che tutti puntino allo stesso problema dell'incapacità di GCC di avere una vasta gamma di tipi di classi non banali.

+1

"Questo è sicuramente un bug". Prova? –

+0

Inoltre hai praticamente copiato la risposta da [questo] (http://stackoverflow.com/questions/37260097/stdarray-with-aggregate-initialization-on-g-generates-huge-code) domanda. Si prega di dare credito dove è dovuto il credito. –