2012-06-15 17 views
5

Questo è gcc 4.4.6 su Linux.gcc consente di compilare il tempo e l'utilizzo della memoria cambiando come dimensione dell'array nei cambiamenti del codice sorgente

Ecco il comportamento

bizarre.c

double a[500000000]; 

main() { 
} 

Se compilo questo utilizzando:

gcc bizarre.c 

Poi il compilatore utilizza 4G di memoria e richiede molto tempo.

Se si effettua la dimensione dell'array 50000000, la compilazione richiede molto meno memoria e tempo.

È come se il compilatore eseguisse il codice che sta compilando.

Mi rendo conto che creare uno schieramento gigantesco in questo modo potrebbe non essere la migliore pratica, ma qualche spiegazione?

+0

Compilando come eseguibile a 32 o 64 bit? –

+0

nessun flag di ottimizzazione? si verificherà un sovraccarico di stack più che probabile ... con l'ottimizzazione attivata, questa variabile verrà probabilmente eliminata se si utilizza l'ottimizzazione superiore a -0 –

+0

@ 0A0D: questo array viene comunque inserito nella sezione '.bss', nessuna pila coinvolta ... – sarnold

risposta

6

È un bug noto di linker relativo a --build-id, ora fissato sulla linea principale. Vedi http://sourceware.org/bugzilla/show_bug.cgi?id=12451 Alcune distribuzioni hanno preso una patch precedente di Nick's che ha calcolato inutilmente un checksum su .bss, richiedendo la sezione .bss da allocare e azzerare. Reclami la tua distribuzione.

Problemi correlati