web-dev-qa-db-ja.com

C ++クラスのサイズ

さまざまなクラスのサイズを出力するコードは次のとおりです

#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)のサイズはどうですか?

11
nurabha

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
4
HappyTran

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

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

3
Praetorian

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

1
Marius