[英]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();
在堆或堆栈中分配的内存在哪里?
成员函数与自由函数没有什么不同,它们只是隐式地将this
指针作为第一个参数。 所以你的成员函数或多或少等同于(让我们忘记你的A
中没有任何东西实际上是可访问的,因为它都是private
)
int get_a(A* obj)
{
int d;
return obj->a;
}
我希望这已经回答了你的问题。 是否通过new
分配obj
对于堆栈中的d
没有任何区别。
应该注意的是,C ++规范实际上并没有要求任何特定的局部变量存储区域,只规定它们的生命周期和范围。 但是编译器使用堆栈是很常见的,因为当函数的范围结束时,它会带来一些更简单的处理。 因此所有局部变量都在堆栈中。
在您的示例中,变量c
和 obj_a_ptr
的存储将位于堆栈中。
请注意, obj_a_ptr
的存储obj_a_ptr
堆栈中,即存储变量值的位置。 对于指针,变量本身位于堆栈上(对于局部变量),但它可能指向任何合适的对象(在堆上或全局或其他任何位置)。
对象的[非静态]数据成员被视为子对象 ,并作为该对象的一部分存储。 因此,如果封装对象是“在堆上”,那么您的成员就“在堆上”。 (如果不是,那里会存储什么?)
但是,这不会影响在成员函数内声明的局部变量。 它们不需要与对象一起存储。 实际上,这在运行时很难做到。
创建对象时,将为其非静态数据成员分配内存。 成员函数不包含在对象占用的内存中,除了它可以包含指向虚函数指针表的指针。
因此在函数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
因此,此演示程序中类的对象的大小与其数据成员x
的大小完全相同(通常,可以使用附加字节填充类以获得对齐)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.