-3

在下面这个for循环在C中的变量x会发生什么?

int main(){ 
int i; 
for(i = 0;i<4;i++){ 
int x = 1; 
x++; 
} // for close 
}// main close 

这里变量x这个代码为'自动存储类,对吧?

因此,将变量x创建,我的意思是当遇到语句时会发生内存分配,并在达到循环结束时被破坏并被创建/内存被再次分配为x

我试图在循环打印的x地址,它打印相同的地址x每time.So,这是否意味着每一次x被创建和销毁,并使用相同的房间/内存块吧?

如果是这样创建和销毁,是不是会影响CPU使用率? 如果是这样,有什么办法来防止它,并保持良好的记忆健康?

回答

2

简答题是“没有”。任何优化编译器都会优化这个变量,因为它永远不会被读取。

即使关闭优化器,变量在输入函数时也会被分配一次,然后在每次迭代中设置为1,然后是增量。

配置非常便宜,因为它在自动存储器中。这个空间是在编译时决定的,所以在运行时它没有任何花费。所有迭代都重复使用相同的位置,因此迭代不会产生额外的成本。

+0

优化器的意思是...你的意思是挥发性关键字,你的意思是从来没有读过什么!!!!?!?!在此先感谢 – Curiousboy

+0

@Curiousboy优化器是编译器的最后一个阶段,它会计算出指令是否可以重新排序或删除,以便使代码更快地运行。通过“从不读”我的意思是没有打印或其他表达式使用x值。 – dasblinkenlight

1

是的,该变量是在循环中的每个回合构造和销毁的。

但是,正如您已经注意到的那样,编译器足够聪明,可以每次为变量重复使用相同的存储。可能在堆栈中,输入函数时可能已经分配了空间。所以没有必要担心“内存管理”。

如果你打开一些优化,编译器也可能会注意到没有任何变量真的用于任何事情,并删除所有的代码。

0

在for循环的每次迭代中,您正在创建变量'x',将其设置为1,并将其递增为2.'x'被破坏,因为它只存在于for循环中。如果您不希望每次迭代都创建并销毁它,则可以简单地在for循环之上声明它。

你究竟在用这段代码试图完成什么?它似乎没有太大的作用。另外,由于您担心内存分配问题,可以在for循环中声明变量“i”,以便在完成for循环后不会将其挂起。

+0

嗨@ Silamoth,在意义上被摧毁......在退出循环或每次迭代之后? – Curiousboy

+0

每次迭代后,它都被销毁。换句话说,它会被创建并销毁4次。然而,正如其他人所说,一个聪明的现代编译器将最终重用变量及其位置,因为每次迭代都会重新创建它。 – Silamoth

0

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