16

これは、さまざまなクラスのサイズを出力するコードです

#include <iostream>

using namespace std;

class EmptyClass
{    
};

class AbstractClass
{
  public: 
          virtual void funcOne() = 0;
          virtual void funcTwo() = 0;
};

class NotAbstrClass
{
  public: int virtFunc( int );
};

class MixClass
{
  public:
          virtual void clFunc( int );
          static int i;
          int j;
};

int main()
{
    // Print size of class or class objects
    cout<<"Size of empty class: "<< sizeof(EmptyClass)<<endl;          
    cout<<"Size of Abstract class :"<< sizeof(AbstractClass)<<endl;
    cout<<"Size of Non Abstract class: "<< sizeof(NotAbstrClass)<<endl;
    cout<<"Size of Mix class: "<< sizeof(MixClass)<<endl;
    return 0;
}

C++11 コンパイラでのプログラムの出力は次のとおりです。

Size of empty class: 1
Size of Abstract class :4
Size of Non Abstract class: 1
Size of Mix class: 8

Empty class のサイズが 1 Size of empty class object である理由を理解しています。抽象クラスの場合、オブジェクトは仮想関数呼び出しメカニズムを実装するためのポインターを格納します。しかし、他のクラス オブジェクト (NotAbstrClass および MixClass) のサイズはどうでしょうか。

4

3 に答える 3

5

NotAbstrClassにはデータ メンバがないため、これも空のクラスです。クラスのサイズをゼロにすることはできないため、 と同じ扱いになりEmptyClassます。

MixClass仮想関数と 1 つの非静的データ メンバーがあります。これらの (vptrおよびint) はそれぞれ、プラットフォーム上で 4 バイトを占めるように見えるため、サイズは 8 バイトです。

于 2013-06-24T18:04:50.313 に答える
3

ギリッシュ・シェティによると:

C++ のクラスのオブジェクトのサイズを決定する要因は多数あります。

これらの要因は次のとおりです。

  • すべての非静的データ メンバーのサイズ
  • データ メンバーの順序
  • バイト アラインメントまたはバイト パディング
  • 直接の基本クラスのサイズ
  • 仮想関数の存在 (仮想関数を使用した動的ポリモーフィズム)。
  • 使用しているコンパイラ
  • 継承のモード (仮想継承)

関連サイトがいくつかありますが、参考になると思います。

クラス オブジェクトのサイズを決定します: http://www.cprogramming.com/tutorial/size_of_class_object.html

メモリ レイアウト: http://www.phpcompiler.org/articles/virtualinheritance.html

また、MVSC を使用する場合は、ソリューション内のすべてのクラスのすべてのメモリ レイアウトを次のようにダンプできます-d1reportAllClassLayout

cl -d1reportAllClassLayout main.cpp
于 2015-06-05T19:16:04.607 に答える
1

NotAbstrClass は、データがないため、ビット サイズについて話すときの空のクラスのようなものです。MixClass には、仮想関数ポインター (32 ビット マシンでは 4 バイト) と int (同じく 4 バイト) があります。

于 2013-06-24T18:03:44.680 に答える