私が持っているとしましょう:
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 ... |
+-------+-----------------------+