C++ 是函数中局部变量的生存时间,必须等于该函数的生存时间';什么是死刑?

C++ 是函数中局部变量的生存时间,必须等于该函数的生存时间';什么是死刑?,c++,compiler-construction,lifetime,optimization,stack-memory,C++,Compiler Construction,Lifetime,Optimization,Stack Memory,可能重复: > C++编译器有自己的方法来确定函数中每个局部变量的生命周期结束,以便它们使用堆栈内存优化,或者它们只是将其等同于函数执行的生命周期? 大多数编译器一次就为堆栈上的所有变量分配内存。例如: void f() { int n = 0; // lifetime of n begins here { int x = 0; // lifetime of x begins here } // lifetime of

可能重复:


<> > C++编译器有自己的方法来确定函数中每个局部变量的生命周期结束,以便它们使用堆栈内存优化,或者它们只是将其等同于函数执行的生命周期?

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

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的生命周期不一样

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

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的生命周期不一样

在函数返回之前,无法回收堆栈变量的内存。这是因为它们是特定调用的堆栈帧的一部分。返回指针在它们下面,调用方的框架在它们上面。显然,返回指针只有在函数返回后才能释放,因此堆栈变量被卡在岩石和坚硬的地方之间,可以说,它们的内存在返回后才能使用。

在函数返回之前,堆栈变量的内存无法回收。这是因为它们是特定调用的堆栈帧的一部分。返回指针在它们下面,调用方的框架在它们上面。显然,返回指针只有在函数返回后才能释放,因此堆栈变量被卡在岩石和坚硬的地方之间,可以说,它们的内存在返回之前将保持不可用。

取决于编译器。此外,如果您对答案不满意,只需编辑您的旧问题。重复:取决于编译器。此外,如果您对答案不满意,只需编辑您的旧问题。重复:当然,假设编译器选择将变量放在堆栈上。@Ron因此在我写的文章中称为“大多数编译器”。只要确保至少在一个答案中提到它;)当然,假设编译器选择将变量放在堆栈上,当然。@Ron因此在我写的文章中是“大多数编译器”。只要确保至少在一个答案中提到它;)