struct/classのメンバーは、そのstruct/classのオブジェクトインスタンス用に割り当てられたメモリブロックに格納されます(スタック上にあるかヒープは問題ではありませんが、オブジェクトがどのように割り当てられた)。メモリ内のオブジェクトのサイズは、データメンバの合計サイズと、コンパイラが整列のためにそれらの間に追加するすべてのパディングです。
new type
のサイズは少なくともsizeof(type)
バイトでダイナミックメモリのブロックを割り当てる(これは、メモリマネージャのオーバーヘッドのために以上であってもよい)と、そのメモリブロックの種類のコンストラクタを呼び出します。
だから、例えば、あなたはこのクラスがある場合:
class Engine
{
private:
int numOfThings;
...
};
は、そのクラスのすべてのインスタンスは、最初の4つのバイトがnumOfThings
メンバーによって占有されているメモリのsizeof(Engine)
バイトを占有します。それは自動メモリのようになります。
Engine engine;
それとも、動的メモリのようになります。
class Engine
{
private:
int numOfThings;
uint32_t values[16];
std::string name;
uint8_t *data;
Engine()
{
data = new uint8_t[256];
}
~Engine()
{
delete[] data;
}
};
:
Engine *engine = new Engine;
は今、Engine
は、自動または動的ている他のメンバー、例えばを持っていることを言うことができます
value
メンバーは(sizeof(uint32_t) * 16)
(4 * 16 = 64)バイトで、これはEngine
クラスの合計サイズに加算されます。
name
のメンバーは、Engine
クラスの合計サイズに追加されたサイズ(STLの実装によって異なる)です(バイト)。しかし、内部的にはstd::string
には文字データ用に割り当てる動的メモリへのポインタがあります。そのメモリのサイズは、Engine
クラスの合計サイズには含まれません。
data
ポインタのサイズはsizeof(uint8_t*)
バイト(32ビットシステムでは4、64ビットシステムでは8)です。これはEngine
クラスの合計サイズに加算されます。 data
が指すメモリブロックは、サイズが(sizeof(uint8_t) * 256)
(1 * 256 = 256)バイトであり、ダイナミックメモリの他の場所に格納されます。
クラスメソッドの内部で宣言されている変数は、クラス自体の一部ではないため、そのサイズには数えません。クラス定義で宣言されているデータメンバーのみがそのサイズにカウントされます。
_「格納されているものはすべてどこにありますか?」_その複合オブジェクトに割り当てられたメモリ内にありますか? –
「誰もが知っている」と推測と嘘が続きます... –
ローカル変数とグローバル変数は何を求めていますか? – cpatricio