它依赖于实现。你看到相同的内存地址,因为编译器决定这样做。内存在每次迭代之前并不会在新地址处神奇地分配。 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