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

Powyższy kod działa w około 170 ms na moim komputerze skompilowanym za pomocą gcc-O0. Jednak przy kompilacji z opcją -Ox, gdzie x> 0, optymalizator sprytnie stwierdza, że ​​żądana pamięć nigdy nie będzie używana i dlatego zostanie wykluczona ze zoptymalizowanego pliku wykonywalnego. Jak to robi?optymalizacja malloc i gcc 2

+3

Co '2' oznacza w tytule? to nie jest jasne. –

+0

@YuHao oni odnieśli się do [ich poprzedniego pytania] (http://stackoverflow.com/questions/17848426/malloc-and-gcc-optimization) –

Odpowiedz

8

Cóż, kompilator widzi, że wartość zwracana nie jest nigdy używana, więc optymalizuje ją. Jeśli chcesz, aby zapobiec malloc wezwanie do optimzed się nawet w -O3 można użyć volatile kwalifikator:

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

Dzięki za odpowiedź i obejść. To naprawdę wspaniałe. Czy to oznacza, że ​​kompilator ma wiedzę o symbolu malloc? Nie rozumiem, jak inaczej można to zrobić. Mam na myśli, jeśli napisałeś swój własny program, czy możesz wywołać to samo zachowanie? – user2616927

+0

@ user2616927 optymalizator zna 'malloc' i uważa, że ​​jest to funkcja bez żadnych skutków ubocznych. – ouah

+1

Tak, możesz użyć atrybutu ['pure' lub' const'] (http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html), aby umożliwić optymalizatorowi dokonanie podobnych optymalizacji pod kątem twoich własnych funkcji . –