堆栈内存是否会被重用

时间:2014-03-06 05:40:59

标签: objective-c c stack

例如:

void test(bool aFlag)
{
  if(aFlag)
  {
     int temp =1;
     //do something
  }
  else
  {
     int temp =2;
     //do something
  }

  int aaaa =0;
}

当超出if / else块时,temp的内存不再使用, aaaa会重用temp的记忆吗?如果愿意,何时以及在什么条件下? 或者临时的地址是' temp'稍后在函数中覆盖。

2 个答案:

答案 0 :(得分:0)

这取决于编译器。该语言不保证存储变量的位置。但是,编译器生成这样的代码通常是有意义的,是的。

答案 1 :(得分:0)

如果是c,则代码后无法创建变量。所以,我假设aaaa和temp会有不同的地址,特别是在调试模式下(他们确实有)。但是在发布编译器中会优化代码,而你无法预测行为(还有分支预测,矢量化和其他cpu功能,它可以使用寄存器而不是局部变量等)。使用volatile使它们不同并在函数顶部声明它们。 通常,当您输入函数时,它会为局部变量和本地存储分配空间,所以

aaa is like dword ptr [aaaa],0
temp 1 is like dword ptr [ebp-14h],1  
temp 2 is like dword ptr [ebp-20h],2