1. 程式人生 > >C/C++--類佔用記憶體的大小計算

C/C++--類佔用記憶體的大小計算

一個類佔用多少記憶體,看下面程式碼:

// TestVS2012.cpp : 定義控制檯應用程式的入口點。
//

#include "stdafx.h"
#include <iostream>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
	class Class1{};

	class Class2
	{
		int m_iValue;
	};

	class Class3
	{
		void fun(){};
	};

	class Class4
	{
		virtual void fun(){};			
	};

	class Class5
	{
		virtual void fun(){};			
		virtual void fun1(){};			
	};

	class Class6
	{
		int m_iValue;
		void fun(){};
	};

	class Class7
	{
		int m_iValue;
		void fun(){};
		virtual void fun1(){};
	};

	class Class8 : public Class4{};

	std::cout << "空類所佔的記憶體大小為 :" << sizeof(Class1) << std::endl;
	std::cout << "只有一個整型變數成員的類所佔的記憶體大小為 :" << sizeof(Class2) << std::endl;
	std::cout << "只有一個普通函式的類所佔的記憶體大小為 :" << sizeof(Class3) << std::endl;
	std::cout << "只有一個虛擬函式的類所佔的記憶體大小為 :" << sizeof(Class4) << std::endl;
	std::cout << "有兩個虛擬函式的類所佔的記憶體大小為 :" << sizeof(Class5) << std::endl;
	std::cout << "有一個普通函式和一個整型變數成員的類所佔的記憶體大小為 :" << sizeof(Class6) << std::endl;
	std::cout << "有一個普通函式和一個整型變數成員和一個虛擬函式的類所佔的記憶體大小為 :" << sizeof(Class7) << std::endl;
	std::cout << "一個空類繼承自一個只有虛擬函式的類,這個類所佔的記憶體大小為 :" << sizeof(Class8) << std::endl;

	getchar();
	return 0;
}



從執行結果可以看出:

1.一個空類所佔的大小的1個位元組,這是因為空類也可以例項化,例項在記憶體得有一個獨一無二的地址,

為了達到這個目的,編譯器往往會給一個空類隱含的加一個位元組,這樣空類在例項化後在記憶體得到了獨一無二的地址

2.類所佔的大小是其成員的大小(並不是所有成員相加之和,要考慮到位元組對齊的問題)

3.普通函式不佔記憶體

4.類所佔的大小為4,虛擬函式的地址會被存放到虛擬函式列表裡去,而這裡的4是虛擬函式列表的地址

5.由4可知,類所佔大小大小跟虛擬函式的數量無關

6.類所佔的大小為其成員的大小之和,這也證明了普通函式不佔記憶體

7.整型變數成員佔4,虛擬函式列表地址佔4

8.子類和其父類用的是同一個虛擬函式列表