C++基本數據類型、結構體、類、聯合內存佔用(二)——結構體、類

C++類和結構體內存佔用方式相同

類的內存佔用規則

(1)空類大小爲1,因爲C++標準規定空類也可以實例化,每個實例在內存中都有一個獨一無二的地址,爲了達到這個目的,編譯器往往會給一個空類隱含的加一個字節,這樣空類在實例化後在內存得到了獨一無二的地址;

(2)類的大小爲非靜態成員數據的類型大小之和,靜態成員存放在全局數據段,不影響類實例化的大小;

(3)類本身的一些特性佔用的大小,虛函數表就佔用4個字節,當類中含有虛函數時,無論是否是繼承來的,無論數量,那麼都會產生一個4字節的指針指向虛函數表;

(4)爲優化存取,會產生字節對其問題;

(5)類的成員函數不會佔用空間。

驗證程序

#include <string>
#include <iostream>

//該類大小爲1,得出:空類大小爲1
class CClassA
{

};

//該類大小爲1,得出:即使沒有使用使用默認構造和析構函數,空類大小也爲1
class CClassB
{
public:
	CClassB()
	{

	}

	~CClassB()
	{

	}

};

//該類大小爲4,得出:虛函數表就佔用4個字節
class CClassC
{
public:
	CClassC()
	{

	}

	virtual ~CClassC()
	{

	}
};

//該類大小爲8,和上面一個類比較得出:成員變量佔用類的內存
class CClassD
{
public:
	CClassD()
	{

	}

	virtual ~CClassD()
	{

	}

	int m_intA;
};

//該類大小爲4,和上面一個類比較得出:靜態成員存放在靜態存儲區,不影響類的大小
class CClassE
{
public:
	CClassE()
	{

	}

	virtual ~CClassE()
	{

	}

	static int m_intA;
};

//該類大小爲8,和CClassD比較得出:成員函數不佔用類的內存
class CClassF
{
public:
	CClassF()
	{

	}

	virtual ~CClassF()
	{

	}

	int m_intA;

	void TestA()
	{
		int i = 0;
		++i;
	}
};

//該類大小爲12,和上面一個類比較得出:爲優化存取,會產生字節對其問題
class CClassG
{
public:
	CClassG()
	{

	}

	virtual ~CClassG()
	{

	}

	int m_intA;
	char m_char;

	void TestA()
	{
		int i = 0;
		++i;
	}
};


int main(int argc, char **argv)
{
	std::cout << "CClassA的大小:" << sizeof(CClassA) << std::endl;
	std::cout << "CClassB的大小:" << sizeof(CClassB) << std::endl;
	std::cout << "CClassC的大小:" << sizeof(CClassC) << std::endl;
	std::cout << "CClassD的大小:" << sizeof(CClassD) << std::endl;
	std::cout << "CClassE的大小:" << sizeof(CClassE) << std::endl;
	std::cout << "CClassF的大小:" << sizeof(CClassF) << std::endl;
	std::cout << "CClassG的大小:" << sizeof(CClassG) << std::endl;
	system("pause");
	return 0;
}

程序運行結果:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章