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

时间:2015-04-10 07:25:49

标签: c++

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

例如:

   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();

3 个答案:

答案 0 :(得分:3)

作为一个心智模型,想象local_variable在某种堆栈上被分配是没有错的,因为它具有自动存储,其范围以函数的范围结束。

成员函数("方法")在这方面与任何其他函数没有区别。一个实现差异是成员函数接收指向当前对象的指针作为隐藏参数,可以在函数内部访问this

如果问题实际上是在运行时分配变量的位置,那将取决于您的编译器,平台和优化级别。优化器可以以令人惊讶的方式转换代码,包括消除大部分代码。许多自动变量将在注册中分配,有些将完全优化 - 例如,在您的情况下,编译器可以发出一条CPU指令,将已知内存地址的整数内容增加5。常量5只会出现在反汇编中(" text"段),而不会出现在堆栈或堆中。

答案 1 :(得分:1)

我们希望,实施将把它们放在特定平台上最有效的地方。对于您引用的示例,这可能会在寄存器中。

答案 2 :(得分:0)

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

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