1

1 つ以上の仮想関数 (仮想関数のみ) を含むクラスのオブジェクトのサイズを知りたいです。誰もが答えは 4 だと言いますが、これらのコードを TCWIN45 で実行しようとすると、出力として 2 が得られました。

コード

4

3 に答える 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 に答える