C++オブジェクトのメモリサイズ
1251 ワード
classがメモリを占有するのは3つの部分から構成されています.
1、静的でないデータの合計サイズ
静的変数はすべてグローバルデータ領域にメモリを割り当てます
2、alignmentの需要によって補充された空間(members間に格納されている可能性もあり、集合体境界に存在する可能性もある)を加える
alignmentとは、busの「輸送量」を最高効率にするために、数値を数の倍数に調整することです.
3、virturalをサポートするために内部から発生したいかなる追加負担を加える.
1つのクラスに虚関数がある場合(自分の虚関数でも継承でも)、クラスには虚関数ポインタというメンバー変数があります.このポインタは虚関数テーブルを指し、虚関数テーブルの最初の項目はクラスのtypeinfo情報であり、その後の項目はこのクラスのすべての虚関数のアドレスです.
出力結果:4 4 4 8
虚関数のベースクラス、派生クラス間の虚関数テーブルに関する問題は陳浩の『C++虚関数テーブル解析』を参照http://blog.csdn.net/sdausxc/article/details/51732045
1、静的でないデータの合計サイズ
静的変数はすべてグローバルデータ領域にメモリを割り当てます
2、alignmentの需要によって補充された空間(members間に格納されている可能性もあり、集合体境界に存在する可能性もある)を加える
alignmentとは、busの「輸送量」を最高効率にするために、数値を数の倍数に調整することです.
3、virturalをサポートするために内部から発生したいかなる追加負担を加える.
1つのクラスに虚関数がある場合(自分の虚関数でも継承でも)、クラスには虚関数ポインタというメンバー変数があります.このポインタは虚関数テーブルを指し、虚関数テーブルの最初の項目はクラスのtypeinfo情報であり、その後の項目はこのクラスのすべての虚関数のアドレスです.
#include "stdafx.h"
#include
using namespace std;
class CBase{
public:
CBase(){}
virtual ~CBase(){}
virtual void fun1(){}
virtual void fun11(){}
};
class CBase2{
public:
CBase2(){}
virtual ~CBase2(){}
};
class CDerived1: public CBase
{
public:
CDerived1(){}
virtual ~CDerived1(){}
virtual void fun(){}
};
class CDerived2: public CBase, public CBase2
{
public:
CDerived2(){}
virtual ~CDerived2(){}
virtual void fun(){}
};
void main()
{
cout << sizeof( CBase) << endl;
cout << sizeof(CBase2) << endl;
cout << sizeof(CDerived1) << endl;
cout << sizeof(CDerived2) << endl;
int yu;
yu =8;
}
出力結果:4 4 4 8
虚関数のベースクラス、派生クラス間の虚関数テーブルに関する問題は陳浩の『C++虚関数テーブル解析』を参照http://blog.csdn.net/sdausxc/article/details/51732045