私が持っているとしましょう:
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個の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つのポインタのみ)、すべての要素をヒープ上に保持します。
xとを含むヒープに1つの割り当てを取得しますy。Aそのオブジェクトを参照するための良い方法です。
Stack Overflowを簡単に利用できればいいのですが、次のような(非常に小さい)ヒープの例と考えることができます。
+-------------------------------+
| Heap |
+-------------------------------+
| Other memory here ... |
+-------+-----------------------+
A *a -> | x | y | Other memory here ... |
+-------+-----------------------+