让我说我有:
class A{
public:
int x;
int y;
};
我分配一个A实例,如:
A *a = new A();
a.x和a.y是否也在堆中分配,因为它们是“依赖”堆分配的对象?
谢谢。
答案 0 :(得分:3)
您将在包含x
和y
的堆上获得一个分配。 A
只是引用该对象的好方法。
我希望我可以轻松地使用Stack Overflow,但你可以想到这样的(非常小的)堆示例:
+-------------------------------+
| Heap |
+-------------------------------+
| Other memory here ... |
+-------+-----------------------+
A *a -> | x | y | Other memory here ... |
+-------+-----------------------+
答案 1 :(得分:3)
了解C ++使用“复制语义”非常重要。这意味着变量和结构字段不包含对值的引用,而是包含值本身。
宣布
时struct A
{
int x;
double yarr[20];
};
您将创建的每个A
将包含一个整数和一个20个双精度数组...例如,它的大小(以字节为单位)将为sizeof(int)+20*sizeof(double)
,并且由于对齐原因可能更多。
当您在堆上分配对象A
时,所有这些字节都将在堆中,当您在堆栈上创建A
的实例时,所有这些字节都将在堆栈中。
当然,一个结构也可以包含指针到其他东西,在这种情况下,指向的内存可能在其他地方......例如:
struct B
{
int x;
double *yarr;
};
在这种情况下,结构B
包含一个整数,指针包含一个双精度数组,内存中B
的大小为sizeof(int)+sizeof(double *)
,可能再来一点。
当您分配B
的实例时,构造函数将决定yarr
指向的内存将从哪里分配。
标准类std::vector
例如非常小(通常只有三个指针),并将所有元素保留在堆上。