2013-07-27 5 views
5
while(count < 30000000){ 
    malloc(24); 
    count++; 
} 

il codice precedente viene eseguito in circa 170 ms sul mio computer compilato con gcc -O0. Tuttavia, compilando con -Ox dove x> 0, l'ottimizzatore calcola abilmente che la memoria richiesta non sarà mai utilizzata e quindi è esclusa dall'eseguibile ottimizzato. Come fa questo?malloc e ottimizzazione gcc 2

+3

Cosa '2' significa il titolo? non è chiaro. –

+0

@YuHao hanno fatto riferimento a [la loro domanda precedente] (http://stackoverflow.com/questions/17848426/malloc-and-gcc-optimization) –

risposta

8

Bene, il compilatore vede il valore di ritorno malloc non viene mai utilizzato, quindi lo ottimizza. Se si desidera impedire malloc chiamata ad essere optimzed fuori anche in -O3 è possibile utilizzare il qualificatore volatile:

while(count < 30000000){ 
    void * volatile p = malloc(24); 
    count++; 
} 
+0

Grazie per la risposta e il lavoro svolto. È davvero fantastico. Ciò significa che il compilatore ha conoscenza del simbolo malloc? Non vedo come altro potrebbe essere fatto. Voglio dire, se hai scritto il tuo allocatore, potresti indurre lo stesso comportamento? – user2616927

+0

@ user2616927 l'ottimizzatore conosce 'malloc' e considera che è una funzione senza effetti collaterali. – ouah

+1

Sì, è possibile utilizzare l'attributo ['pure' o' const'] (http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html) per consentire all'ottimizzatore di eseguire ottimizzazioni simili relative alle proprie funzioni . –