2016-11-03 7 views
-9

"new"演算子で作成されたオブジェクトがヒープに割り当てられていることは誰もが知っていますが、オブジェクトが本当に複雑でメンバ、ローカル変数などがあればどうでしょうか?保存されているものはどこにありますか?オブジェクトを新規作成するとどうなりますか?

私はクラスエンジンのオブジェクトを持っているとしましょう。本当に複雑なものです。どこか私のコードでは、私はこれを実行します。

Engine* e = new Engine; 

だから、それは簡単ですが、ポインタがスタックに進み、エンジンの新しいインスタンスがヒープ上に作成されます。しかし、クラスエンジンでは、私はポインタではないフィールドを持っています - このフィールドはどこに格納されていますか?また、Engineクラスでローカル変数を使用するメソッドがある場合(ヒープにも格納されます)

+2

_「格納されているものはすべてどこにありますか?」_その複合オブジェクトに割り当てられたメモリ内にありますか? –

+3

「誰もが知っている」と推測と嘘が続きます... –

+0

ローカル変数とグローバル変数は何を求めていますか? – cpatricio

答えて

1

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)バイトであり、ダイナミックメモリの他の場所に格納されます。

クラスメソッドの内部で宣言されている変数は、クラス自体の一部ではないため、そのサイズには数えません。クラス定義で宣言されているデータメンバーのみがそのサイズにカウントされます。

+0

ありがとう!エンジンクラスの中に私がメソッドf.eを持っていればどうですか? "int temp = 4"のようなローカル変数を宣言するrun() - エンジンがヒープ上に割り当てられた場合、これがどこに格納されるのですか? –

関連する問題