如果通过new创建对象,成员函数的局部变量在哪里创建?
Where is local variable of member function created if object is created via new?
Class A
{
int a;
int get_a()
{
int d;
return a;
}
};
A* obj_a_ptr = new A;
int c = A->get_a();
int d 内存分配在哪里,是在堆中还是在堆栈中?
成员函数与自由函数没有太大区别,它们只是隐含地获得一个 this
指针作为第一个参数。所以你的成员函数或多或少等同于(让我们忘记你的 A
中没有任何东西实际上是可访问的,因为它都是 private
)
int get_a(A* obj)
{
int d;
return obj->a;
}
我希望这已经回答了您的问题。 obj
是否通过 new
分配对 d
是否在堆栈上没有影响。
创建对象时,会为其非静态数据成员分配内存。成员函数不包括在对象占用的内存中,但它可以包含指向虚函数指针table的指针。
所以在函数get_a
中局部变量d
有自动存储期限。退出函数后,对象的成员函数不需要的任何其他函数都可以使用内存。
考虑以下演示程序
#include <iostream>
struct A
{
explicit A( int x = 0 ) : x( x ) {}
int x;
static int a[];
int get() const { return x; }
void set( int x ) { A::x = x; }
};
int A::a[100];
int main()
{
std::cout << "sizeof( A ) = " << sizeof( A ) << '\n';
}
它的输出是
sizeof( A ) = 4
所以在这个演示程序中class的一个对象的大小恰好等于它的数据成员x
的大小(一般来说class可以用获得对齐的额外字节)。
对象的[非静态]数据成员被视为子对象,并作为该对象的一部分存储。所以如果封装对象是"on the heap",那么你的成员就是"on the heap"。 (如果不是, 会存储什么?)
但是,这不会影响在成员函数内声明的局部变量。不需要将它们与对象一起存储。事实上,这在运行时很难做到。
需要注意的是,C++ 规范实际上并没有为局部变量规定任何特定的存储区域,只是规定了它们的生命周期和作用域。但编译器通常使用堆栈,因为这会在函数范围结束时带来一些更简单的处理。因此 所有 局部变量都在堆栈上。
在您的示例中,变量 c
和 obj_a_ptr
的存储将在堆栈上。
请注意,obj_a_ptr
的存储也在堆栈上,这是存储变量值的地方。对于指针,变量本身在堆栈上(对于局部变量),但它可能指向任何合适的对象(在堆上或全局或其他任何地方)。
Class A
{
int a;
int get_a()
{
int d;
return a;
}
};
A* obj_a_ptr = new A;
int c = A->get_a();
int d 内存分配在哪里,是在堆中还是在堆栈中?
成员函数与自由函数没有太大区别,它们只是隐含地获得一个 this
指针作为第一个参数。所以你的成员函数或多或少等同于(让我们忘记你的 A
中没有任何东西实际上是可访问的,因为它都是 private
)
int get_a(A* obj)
{
int d;
return obj->a;
}
我希望这已经回答了您的问题。 obj
是否通过 new
分配对 d
是否在堆栈上没有影响。
创建对象时,会为其非静态数据成员分配内存。成员函数不包括在对象占用的内存中,但它可以包含指向虚函数指针table的指针。
所以在函数get_a
中局部变量d
有自动存储期限。退出函数后,对象的成员函数不需要的任何其他函数都可以使用内存。
考虑以下演示程序
#include <iostream>
struct A
{
explicit A( int x = 0 ) : x( x ) {}
int x;
static int a[];
int get() const { return x; }
void set( int x ) { A::x = x; }
};
int A::a[100];
int main()
{
std::cout << "sizeof( A ) = " << sizeof( A ) << '\n';
}
它的输出是
sizeof( A ) = 4
所以在这个演示程序中class的一个对象的大小恰好等于它的数据成员x
的大小(一般来说class可以用获得对齐的额外字节)。
对象的[非静态]数据成员被视为子对象,并作为该对象的一部分存储。所以如果封装对象是"on the heap",那么你的成员就是"on the heap"。 (如果不是, 会存储什么?)
但是,这不会影响在成员函数内声明的局部变量。不需要将它们与对象一起存储。事实上,这在运行时很难做到。
需要注意的是,C++ 规范实际上并没有为局部变量规定任何特定的存储区域,只是规定了它们的生命周期和作用域。但编译器通常使用堆栈,因为这会在函数范围结束时带来一些更简单的处理。因此 所有 局部变量都在堆栈上。
在您的示例中,变量 c
和 obj_a_ptr
的存储将在堆栈上。
请注意,obj_a_ptr
的存储也在堆栈上,这是存储变量值的地方。对于指针,变量本身在堆栈上(对于局部变量),但它可能指向任何合适的对象(在堆上或全局或其他任何地方)。