它取决于实现。您会看到相同的内存地址,因为编译器决定这样做。在每次迭代之前,内存不会神奇地分配到新地址。架构中的自动存储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