奇妙な一時的な変数を追加します:Linux上でGCC(v4.4.5、なしの最適化)とそれをGCCは、私はこのコードを作成している
#include <stdio.h>
typedef unsigned int uint;
uint in[2]={1,2},out[2]={3,4};
int main() {
in[0]=out[0]/10;
}
をコンパイルし、結果のアセンブリは次のようになります。今
0000000000400474 <main>:
400474: 55 push rbp
400475: 48 89 e5 mov rbp,rsp
400478: 8b 05 ae 03 20 00 mov eax,DWORD PTR [rip+0x2003ae] # 0082c <out>
40047e: 89 45 fc mov DWORD PTR [rbp-0x4],eax
400481: ba cd cc cc cc mov edx,0xcccccccd
400486: 8b 45 fc mov eax,DWORD PTR [rbp-0x4]
400489: f7 e2 mul edx
40048b: 89 d0 mov eax,edx
40048d: c1 e8 03 shr eax,0x3
400490: 89 05 8e 03 20 00 mov DWORD PTR [rip+0x20038e],eax # 600824 <in>
400496: c9 leave
400497: c3 ret
400498: 90 nop
400499: 90 nop
40049a: 90 nop
40049b: 90 nop
40049c: 90 nop
40049d: 90 nop
40049e: 90 nop
40049f: 90 nop
問題は、このコードは5行目で何をしているのですか?
40047e: 89 45 fc mov DWORD PTR [rbp-0x4],eax
メモリ内のある場所に再び値[0]を保存していませんか?なぜそうなのか?私はある場所にすぐに読み書きするように言っていませんでした。
さて、この一時的な変数は、ライン#7上のアドレス400486で再度表示されます。
400486: 8b 45 fc mov eax,DWORD PTR [rbp-0x4]
この例では、GCCは非常に非効率的なコードを生成しているように見え、それが原因でこれらのキャッシュラインを追い出します一時的な貯蔵。確認してください、多分私が得ていない何かがあります。
まあ、あなたは最適化がないと言っていました。 –
もちろん非効率なコードを生成しています。あなたはそれを最適化しないように言いました。 – Dave
'rbp-0x4'はスタックしていませんか?以前は 'mov rbp、rsp'を行っています。 –