1 つ以上の仮想関数 (仮想関数のみ) を含むクラスのオブジェクトのサイズを知りたいです。誰もが答えは 4 だと言いますが、これらのコードを TCWIN45 で実行しようとすると、出力として 2 が得られました。
質問する
80 次
3 に答える
3
技術的には、クラス オブジェクトのサイズはUnspecifiedです。
動的ディスパッチの実装は、コンパイラに対してオープンのままであることに注意してください。実装は、選択した任意のメカニズムを使用でき、それを文書化する必要はありません。
ほとんどの実装では、すべてのクラス オブジェクトに仮想ポインタが追加され、オーバーヘッドが追加される仮想テーブルおよびポインタメカニズムが使用されます。サイズに追加される可能性のある他のものもあります。
通常、
オブジェクトのサイズ = 非静的データ メンバーのサイズ + パディング バイト + vptr のサイズ (該当するもの)
于 2012-08-31T09:42:43.850 に答える
2
「TCWIN45」は古い 16 ビット コンパイラです。そこでは、各ポインターは 2 バイトです。典型的な答え (4) は、はるかに一般的な 32 ビット コンパイラに適用されます。
于 2012-08-31T11:28:22.410 に答える
0
状況によって異なりますが、通常はポインタのサイズ(4または8バイト)ですが、この場合、グローバルテーブルのインデックスである可能性が非常に高くなります。コンパイラはおそらく、プログラム全体に2^16個以下のポリモーフィッククラスがあると想定していました。
編集:必ずしもプログラム全体ではありませんが、少なくとも現在のクラス階層では。
于 2012-08-31T09:45:57.990 に答える