它依賴於實現。你看到相同的內存地址,因爲編譯器決定這樣做。內存在每次迭代之前並不會在新地址處神奇地分配。 x86
體系結構中的自動存儲是使用堆棧實現的,分配僅通過減去指向堆棧頂部的ESP
/RSP
(x86/x64)寄存器完成。你可以在互聯網上閱讀關於它的文章。
編譯器只是重新分配內存每次迭代(不分配/解除分配)
這是你的代碼(GCC 6.3,X86)的裝配上市。彙編語言的評論始於;
。我喜歡添加僞C到解釋指令
main:
push ebp
mov ebp, esp ; Create new stack frame
sub esp, 16 ; Allocate memory for local variables
mov DWORD PTR [ebp-4], 0 ; i = 0;
.L3:
cmp DWORD PTR [ebp-4], 3 ; if(i > 3)
; {
jg .L2 ; break;
; }
mov DWORD PTR [ebp-8], 1 ; x = 1;
add DWORD PTR [ebp-8], 1 ; x += 1;
add DWORD PTR [ebp-4], 1 ; i += 1;
jmp .L3 ; Go to location .L3
.L2:
mov eax, 0 ; Set return value to 0
leave ; Restore the stack pointer
ret ; Return to the caller
所以ebp - 8
(或int x
)地址含義每次都將是一樣的。
這是優化的代碼彙編列表(GCC 6.3, - O3,x86)。
main:
xor eax, eax ; Set return value to 0
ret ; Return to the caller
優化器的意思是...你的意思是揮發性關鍵字,你的意思是從來沒有讀過什麼!!!!?!?!在此先感謝 – Curiousboy
@Curiousboy優化器是編譯器的最後一個階段,它會計算出指令是否可以重新排序或刪除,以便使代碼更快地運行。通過「從不讀」我的意思是沒有打印或其他表達式使用x值。 – dasblinkenlight