堆分配类的成员是否在堆中自动分配?

时间:2012-10-10 19:18:34

标签: c++ heap allocation

让我说我有:

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

我分配一个A实例,如:

A *a = new A();

a.x和a.y是否也在堆中分配,因为它们是“依赖”堆分配的对象?

谢谢。

2 个答案:

答案 0 :(得分:3)

您将在包含xy的堆上获得一个分配。 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例如非常小(通常只有三个指针),并将所有元素保留在堆上。