假设我有:
class A{
public:
int x;
int y;
};
我分配了一个 A 实例,例如:
A *a = new A();
ax 和 ay 是否也在堆中分配,因为它们“依赖”于堆分配的对象?
谢谢你。
假设我有:
class A{
public:
int x;
int y;
};
我分配了一个 A 实例,例如:
A *a = new A();
ax 和 ay 是否也在堆中分配,因为它们“依赖”于堆分配的对象?
谢谢你。
重要的是要了解 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
非常小(通常只有三个指针),并将所有元素保留在堆上。
您将在包含x
和的堆上获得一个分配y
。A
只是引用该对象的好方法。
我希望我可以轻松地利用 Stack Overflow,但您可以将它想象成这样的(非常小的)堆示例:
+-------------------------------+
| Heap |
+-------------------------------+
| Other memory here ... |
+-------+-----------------------+
A *a -> | x | y | Other memory here ... |
+-------+-----------------------+