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

上記のコードは、gcc -O0でコンパイルされたコンピュータで約170ミリ秒で実行されます。しかし、x> 0の-Oxでコンパイルすると、オプティマイザは要求されたメモリが決して使用されないことを賢明に理解し、最適化された実行可能ファイルから除外されます。これはどうやって?mallocとgccの最適化2

+3

は 'タイトルに何を意味2'ん:あなたも-O3に出optimzedされるmallocコールを防ぎたい場合は、volatile修飾子を使用することができますか?それははっきりしていません。 –

+0

@YuHao [彼らの以前の質問](http://stackoverflow.com/questions/17848426/malloc-and-gcc-optimization) –

答えて

8

コンパイラは、mallocの戻り値が使用されないと判断して、最適化します。

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)を使うと、オプティマイザが自分の関数に関する同様の最適化を行えるようになります。 –

関連する問題