0

次の基本クラスがあり、このクラスのサイズを確認したところ、16バイトが表示されました。fun()からvirtualキーワード を削除すると、4 バイトが表示されます。

この振る舞いがわかりません。ポインタはありますか?

class base
{
        public :
        int a;
        virtual void fun()
        {
        }
};

gcc バージョン: gcc バージョン 4.1.2 20080704

OS : Linux 2.6.18-308.el5 #1 SMP Fri Jan 27 17:17:51 EST 2012 x86_64 x86_64 x86_64 GNU/Linux

4

3 に答える 3

7

コンパイラは、仮想ディスパッチ機構をサポートするために、各インスタンス内にポインターを格納しているようです (これは非常に一般的で、v テーブル ポインターと呼ばれます)。64 ビット アーキテクチャを使用しているため、クラスのサイズに 8 バイトが追加され、配置も 8 バイトになります。配列要素のアラインメントを機能させるには、サイズは常にアラインメントの倍数でなければならないため、アラインメントのために 4 バイトのパディングがあり、合計で 16 になります。

于 2013-09-27T05:20:30.510 に答える
1

実行時に仮想メソッドまたは仮想基本クラスのポリモーフィック動作を実装するために、コンパイラの実装では特定の隠しメンバーが追加されます。これは、コンパイラおよびプラットフォーム固有の動作です。ポリモーフィック クラスのサイズは、コンパイラの実装によって異なります。

これにより、C++ オブジェクト メモリ モデルは C メモリ モデルと互換性がなくなります。

于 2013-09-27T05:23:54.947 に答える