函数中局部变量的生命周期是否必然等于该函数执行的生命周期?

时间:2010-07-13 17:36:57

标签: c++ compiler-construction lifetime optimization stack-memory

  

可能重复:
  how does an optimizing c++ compiler reuse stack slot of a function?

c ++编译器是否有办法确定函数中每个局部变量的生命周期结束的时间,以便使用堆栈内存进行优化,或者它们只是等于函数执行的生命周期?

2 个答案:

答案 0 :(得分:3)

在函数返回之前,无法回收堆栈变量的内存。这是因为它们是特定调用的堆栈帧的一部分。返回指针位于它们下方,并且调用者的帧位于它们上方。显然,返回指针直到函数返回后才能被释放,因此堆栈变量卡在摇滚和硬地之间,可以这么说,直到返回之后它们的内存仍然无法使用。

答案 1 :(得分:2)

大多数编译器一次性为堆栈中的所有变量分配内存。例如:

void f()  {
   int n = 0;      // lifetime of n begins here
   {
      int x = 0;   // lifetime of x begins here
   }               // lifetime of x ends here
}                  // lifetime of n end here 

会在函数入口上为两个整数分配一次内存。但是,这是一个实现细节,对程序员来说是不可见的,并且两个变量n和x的生命周期不同。