while(count < 30000000){
malloc(24);
count++;
}
上面的代碼在我的計算機上用gcc -O0編譯運行大約170毫秒。但是,使用-Ox(其中x> 0)進行編譯時,優化程序巧妙地發現所請求的內存將永遠不會被使用,因此它將從優化的可執行文件中排除。它是如何做到的?malloc和gcc優化2
while(count < 30000000){
malloc(24);
count++;
}
上面的代碼在我的計算機上用gcc -O0編譯運行大約170毫秒。但是,使用-Ox(其中x> 0)進行編譯時,優化程序巧妙地發現所請求的內存將永遠不會被使用,因此它將從優化的可執行文件中排除。它是如何做到的?malloc和gcc優化2
編譯器看到的是malloc
從不使用返回值,所以它優化了它。如果你想防止malloc
通話,即使在-O3
被optimzed出可以使用volatile
預選賽:
while(count < 30000000){
void * volatile p = malloc(24);
count++;
}
感謝您的答案和解決。這真的很棒。這是否意味着編譯器具有malloc符號的知識?我看不出還有什麼可以做的。我的意思是,如果你寫了自己的分配器,你會引發同樣的行爲嗎? – user2616927
@ user2616927優化器知道'malloc'並認爲它是一個沒有副作用的函數。 – ouah
是的,你可以使用['pure'或'const'屬性](http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html)來允許優化器對你自己的函數進行類似的優化。 –
是什麼'2'指的是在標題?目前尚不清楚。 –
@YuHao他們提到[他們以前的問題](http://stackoverflow.com/questions/17848426/malloc-and-gcc-optimization) –