可能重复:
优化的 c++ 编译器如何重用函数的堆栈槽?
c++ 编译器是否有方法来确定函数中每个局部变量的生命周期结束的时间,以便它们使用堆栈内存进行优化,或者他们只是将其等同于函数执行的生命周期?
可能重复:
优化的 c++ 编译器如何重用函数的堆栈槽?
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 的生命周期并不相同。