3

http://www.careercup.com/question?id=17225664は、空のクラス オブジェクトのサイズが少なくとも 1 であると述べています。

では、サイズが非常に小さい場合、デフォルトコンストラクタ、デストラクタ、コピーコンストラクタなどはどのようにオブジェクトに組み込まれているのでしょうか?

4

2 に答える 2

4

では、サイズが非常に小さい場合、デフォルトコンストラクタ、デストラクタ、コピーコンストラクタなどはどのようにオブジェクトに組み込まれているのでしょうか?

これらはメンバー関数であり、メンバー関数のコードはオブジェクトのサイズを増やしません。それは単なるコードです。作成するすべてのオブジェクトに対してインスタンス化されるわけではありません。クラスにメンバー関数を追加しても、そのクラスのインスタンスのサイズは増加しません。データではなくコードです。

thisメンバー関数のコードは、作成するクラスのインスタンスの数に関係なく 1 回生成され、渡される暗黙のポインターにアクセスすることによって呼び出される特定のオブジェクトに作用します。簡単に言うと、この式は次のようになります。

obj.foo();

コンパイラによって内部的に次の式に変換されます。

foo(&obj);

この点でクラスのインスタンスのサイズに影響を与える可能性がある唯一のことは、オブジェクトに少なくとも 1 つの仮想関数があるかどうかです。その場合、各オブジェクトは、ポリモーフィック ディスパッチを有効にするために、そのvtableへの追加のポインターを格納する必要があります。

于 2013-05-26T17:32:14.510 に答える
1

実際の C++ 実装では、非仮想メンバー関数 (ctor などを含む) はオブジェクトの一部を形成しません。したがって、サイズには影響しません。*


* 仮想メンバー関数は、通常、各オブジェクトのサイズを増やす vptrで実装されます。

于 2013-05-26T17:31:49.877 に答える