4

假设我有:

class A{
    public:
    int x;
    int y;
};

我分配了一个 A 实例,例如:

A *a = new A();

ax 和 ay 是否也在堆中分配,因为它们“依赖”于堆分配的对象?

谢谢你。

4

2 回答 2

4

重要的是要了解 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非常小(通常只有三个指针),并将所有元素保留在堆上。

于 2012-10-10T19:29:52.490 回答
3

您将在包含x和的堆上获得一个分配yA只是引用该对象的好方法。

我希望我可以轻松地利用 Stack Overflow,但您可以将它想象成这样的(非常小的)堆示例:

        +-------------------------------+
        |            Heap               | 
        +-------------------------------+
        | Other memory here ...         | 
        +-------+-----------------------+
A *a -> | x | y | Other memory here ... |
        +-------+-----------------------+
于 2012-10-10T19:20:03.970 回答