我創造了這個代碼:在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]?爲什麼這樣?我沒有告訴它立即讀取和寫入某個位置。
現在,這個時間變量的地址400486再次出現上線#7:
400486: 8b 45 fc mov eax,DWORD PTR [rbp-0x4]
它看起來就像這個例子GCC是產生非常低效的代碼,它會驅逐,因爲這些高速緩存行暫時存儲。請確認,也許有一些我沒有得到。
那麼,你沒有說優化。 –
當然,它產生的代碼效率低下;你告訴它不要優化。 – Dave
堆棧不是'rbp-0x4'嗎?它以前使用'mov rbp,rsp'。 –