C++如果我有一个对象指针,是在堆栈或堆上分配的方法变量

C++ If I have an object pointer, are the method variables allocated on the stack or heap?

本文关键字:分配 变量 方法 堆栈 如果 一个对象 指针 C++      更新时间:2023-10-16

我已经搜索了大约一个小时,但还没有找到明确的答案。如果我使用对象指针,本地变量是否在堆栈上分配?

例如:

   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将只存在于反汇编("文本"段)中,而不存在于堆栈或堆中。

我们希望,实现将把它们放在特定平台上最高效的地方。对于你引用的例子,这很可能会出现在寄存器中。

对象指针和其他局部变量之间没有区别。在非优化编译器中,通常所有的局部变量都在堆栈上。尽管对象指针本身在堆栈上,但它将指向任意内存位置,最常见的是在堆上。

在优化编译器中,局部变量通常位于寄存器中,但指针仍然可以指向任何内存位置。