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

приведенный выше код работает около 170 мс на моем компьютере, скомпилированном с gcc -O0. Однако, компилируя с -Ox, где x> 0, оптимизатор умело выясняет, что запрошенная память никогда не будет использоваться и поэтому исключена из оптимизированного исполняемого файла. Как оно работает?Оптимизация malloc и gcc 2

+3

Что '2' означает в названии? не ясно. –

+0

@YuHao они упомянули [их предыдущий вопрос] (http://stackoverflow.com/questions/17848426/malloc-and-gcc-optimization) –

ответ

8

Ну, компилятор видит malloc Возвращаемое значение никогда не используется, поэтому оно оптимизирует его. Если вы хотите, чтобы предотвратить malloc вызов быть optimzed, даже в -O3 вы можете использовать volatile спецификатор:

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

Спасибо за ответ и обойдусь. Это действительно здорово. Означает ли это, что компилятор знает символ malloc? Я не понимаю, как это можно сделать. Я имею в виду, если бы вы написали свой собственный распределитель, не могли бы вы вызвать такое же поведение? – user2616927

+0

@ user2616927 оптимизатор знает 'malloc' и считает, что это функция без побочных эффектов. – ouah

+1

Да, вы можете использовать атрибут ['pure' или' const' (http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html), чтобы оптимизатор мог сделать аналогичную оптимизацию относительно ваших собственных функций , –

Смежные вопросы