C++オブジェクトのメモリサイズ

1251 ワード

classがメモリを占有するのは3つの部分から構成されています.
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