さまざまなクラスのサイズを出力するコードは次のとおりです
#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
空のクラスのサイズが1である理由を理解しています 空のクラスオブジェクトのサイズ 。抽象クラスの場合、オブジェクトは仮想関数呼び出しメカニズムを実装するためのポインターを格納します。しかし、他のクラスオブジェクト(NotAbstrClassとMixClass)のサイズはどうですか?
Girish Shettyによると:
C++のクラスのオブジェクトのサイズを決定する多くの要因があります。
これらの要因は次のとおりです。
- すべての非静的データメンバーのサイズ
- データメンバーの順序
- バイトアラインメントまたはバイトパディング
- その直接の基本クラスのサイズ
- 仮想関数の存在(仮想関数を使用した動的ポリモーフィズム)。
- 使用されているコンパイラ
- 遺伝形式(仮想継承)
ここにいくつかの関連するウェブサイトがあります、私はそれがあなたに役立つことができると思います。
クラスオブジェクトのサイズを決定します: http://www.cprogramming.com/tutorial/size_of_class_object.html
メモリレイアウト: http://www.phpcompiler.org/articles/virtualinheritance.html
また、MVSCを使用する場合は、次のように-d1reportAllClassLayout
を使用して、ソリューション内のすべてのクラスのすべてのメモリレイアウトをダンプできます。
cl -d1reportAllClassLayout main.cpp
NotAbstrClass
にはデータメンバーがないため、これも空のクラスです。クラスのサイズをゼロにすることはできないため、EmptyClass
と同じ扱いを受けます。
MixClass
には仮想関数があり、1つの非静的データメンバーがあります。これら(vptr
とint
)はそれぞれプラットフォーム上で4バイトを占めるように見えるため、サイズは8バイトです。
NotAbstrClassは、データがないため、ビットサイズについて話すときは空のクラスのようなものです。 MixClassには、仮想関数ポインター(32ビットマシンでは4バイト)とint(これも4バイト)があります。