我现在已经找了大约一个小时,但没有找到明确的答案。如果我使用对象指针,是否在堆栈上分配了局部变量?
例如:
class SomeClass {
public:
int a;
int some_method() {
int local_variable = 5;
return local_variable + a;
}
};
SomeClass *obj_ptr = new SomeClass();
obj_ptr->a = 5; // I'm aware that this variable is allocated on the heap.
// Is local_variable allocated on the stack? Is the return value on the stack?
obj_ptr->some_method();
答案 0 :(得分:3)
作为一个心智模型,想象local_variable
在某种堆栈上被分配是没有错的,因为它具有自动存储,其范围以函数的范围结束。
成员函数("方法")在这方面与任何其他函数没有区别。一个实现差异是成员函数接收指向当前对象的指针作为隐藏参数,可以在函数内部访问this
。
如果问题实际上是在运行时分配变量的位置,那将取决于您的编译器,平台和优化级别。优化器可以以令人惊讶的方式转换代码,包括消除大部分代码。许多自动变量将在注册中分配,有些将完全优化 - 例如,在您的情况下,编译器可以发出一条CPU指令,将已知内存地址的整数内容增加5。常量5
只会出现在反汇编中(" text"段),而不会出现在堆栈或堆中。
答案 1 :(得分:1)
我们希望,实施将把它们放在特定平台上最有效的地方。对于您引用的示例,这可能会在寄存器中。
答案 2 :(得分:0)
对象指针和其他局部变量之间没有区别。在非优化编译器中,通常所有局部变量都在堆栈中。尽管对象指针本身位于堆栈上,但它将指向任意内存位置,最常见的是在堆上。
在优化编译器中,局部变量通常位于寄存器中,但仍然可以指向任何内存位置。