C++如果我有一个对象指针,是在堆栈或堆上分配的方法变量
C++ If I have an object pointer, are the method variables allocated on the stack or heap?
我已经搜索了大约一个小时,但还没有找到明确的答案。如果我使用对象指针,本地变量是否在堆栈上分配?
例如:
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();
作为一个心理模型,假设local_variable
是在某种堆栈上分配的并没有错,因为它具有自动存储,并且它的范围以函数的范围结束。
成员函数("方法")在这方面与任何其他函数没有什么不同。一个实现的区别是,成员函数接收指向当前对象的指针,作为函数内部可访问的隐藏参数this
。
如果问题实际上是在运行时将变量分配到哪里,那将取决于编译器、平台和优化级别。优化器可以以令人惊讶的方式转换代码,包括消除大部分代码。许多自动变量将以寄存器的形式分配,有些将被完全优化掉-例如,在您的情况下,编译器可以发出一条CPU指令,将已知内存地址的整数内容增加5。常量5
将只存在于反汇编("文本"段)中,而不存在于堆栈或堆中。
我们希望,实现将把它们放在特定平台上最高效的地方。对于你引用的例子,这很可能会出现在寄存器中。
对象指针和其他局部变量之间没有区别。在非优化编译器中,通常所有的局部变量都在堆栈上。尽管对象指针本身在堆栈上,但它将指向任意内存位置,最常见的是在堆上。
在优化编译器中,局部变量通常位于寄存器中,但指针仍然可以指向任何内存位置。
相关文章:
- 何时在函数中声明堆栈分配变量?
- 取消引用指针并立即为其分配变量,导致分段错误
- 在C++中动态分配变量类型
- 在函数 (c++) 中分配变量类型和大小数组
- 无法在命名空间范围内分配变量
- 自我分配变量的定义
- 在 CUDA C++中分配变量 - 无法分配设备变量
- 在 CPP 中动态分配变量的数据类型
- 为什么无法在类主体中分配变量?
- const 类方法是否阻止在类外部分配变量?
- 从文件中分配变量,并使用定界符分配
- 分配指针后,是否可以为指针指向的事物分配变量名称?
- 读取外部文件并在类似xml的输入中分配变量
- 有没有办法在不分配变量的情况下将字符串连接到数字
- 如果使用alloca在内联函数中的堆栈上分配变量,那么在内联函数返回后,其引用是否有效
- 堆分配变量的结构成员对齐
- 包含溢出缓冲区的堆栈分配变量,也称为缓冲区
- 在 GetTransfer 之后,我在帐户 1 收到未分配变量错误。我无法弄清楚我搞砸了什么逻辑错误
- 对动态分配的变量的引用与指向相同动态分配变量的指针
- 在C++中为用户输入分配变量