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

上面的代碼在我的計算機上用gcc -O0編譯運行大約170毫秒。但是,使用-Ox(其中x> 0)進行編譯時,優化程序巧妙地發現所請求的內存將永遠不會被使用,因此它將從優化的可執行文件中排除。它是如何做到的?malloc和gcc優化2

+3

是什麼'2'指的是在標題?目前尚不清楚。 –

+0

@YuHao他們提到[他們以前的問題](http://stackoverflow.com/questions/17848426/malloc-and-gcc-optimization) –

回答

8

編譯器看到的是malloc從不使用返回值,所以它優化了它。如果你想防止malloc通話,即使在-O3被optimzed出可以使用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)來允許優化器對你自己的函數進行類似的優化。 –