while(count < 30000000){
malloc(24);
count++;
}
上記のコードは、gcc -O0でコンパイルされたコンピュータで約170ミリ秒で実行されます。しかし、x> 0の-Oxでコンパイルすると、オプティマイザは要求されたメモリが決して使用されないことを賢明に理解し、最適化された実行可能ファイルから除外されます。これはどうやって?mallocとgccの最適化2
while(count < 30000000){
malloc(24);
count++;
}
上記のコードは、gcc -O0でコンパイルされたコンピュータで約170ミリ秒で実行されます。しかし、x> 0の-Oxでコンパイルすると、オプティマイザは要求されたメモリが決して使用されないことを賢明に理解し、最適化された実行可能ファイルから除外されます。これはどうやって?mallocとgccの最適化2
コンパイラは、malloc
の戻り値が使用されないと判断して、最適化します。
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'ん:あなたも
-O3
に出optimzedされるmalloc
コールを防ぎたい場合は、volatile
修飾子を使用することができますか?それははっきりしていません。 –@YuHao [彼らの以前の質問](http://stackoverflow.com/questions/17848426/malloc-and-gcc-optimization) –