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個のdoubleの配列が含まれます。たとえば、バイト単位のサイズはsizeof(int)+20*sizeof(double)、アライメント上の理由から、さらに大きくなる可能性があります。

オブジェクトAをヒープに割り当てると、それらのすべてのバイトがヒープに含まAれ、スタックにインスタンスを作成すると、それらのすべてのバイトがスタックに含まれます。

もちろん、構造体には他の何かへのポインタを含めることもできます。この場合、指定されたメモリは別の場所にある可能性があります...たとえば、次のようになります。

struct B
{
   int x;
   double *yarr;
};

この場合、構造体Bには整数とdoubleの配列へのポインタBが含まれ、メモリ内のサイズはissizeof(int)+sizeof(double *)であり、場合によってはもう少し大きくなります。コンストラクターのインスタンスを割り当てると、Bが指すメモリyarrがどこから割り当てられるかが決まります。

std::vectorたとえば、標準クラスは非常に小さく(通常は3つのポインタのみ)、すべての要素をヒープ上に保持します。

于 2012-10-10T19:29:52.490 に答える
3

xとを含むヒープに1つの割り当てを取得しますyAそのオブジェクトを参照するための良い方法です。

Stack Overflowを簡単に利用できればいいのですが、次のような(非常に小さい)ヒープの例と考えることができます。

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