C 中怎麼求類的大小?以及記憶體對齊原理

2021-08-21 01:45:27 字數 2158 閱讀 9579

2023年04月22日 10:51:49

"code" class=

"cpp">#include

using

namespace

std;

intmain();

cout

<<

sizeof(s);

return

0;

}程式居然輸出為

1!到底是怎麼回事?首先我在這裡要宣告一點——類在未初始化之前確實不會分配空間,這裡**的是

sizeof(類)的問題,詳細情況看下面的例子

c++中的類所佔記憶體空間總結

類所佔記憶體的大小是由成員變數(靜態變數除外)決定的,成員函式(這是籠統的說,後面會細說)是不計算在內的。

摘抄部分:

成員函式還是以一般的函式一樣的存在。a.fun()是通過fun(a.

this)來呼叫的。所謂成員函式只是在名義上是類裡的。其實成員函式的大小不在類的物件裡面,同乙個類的多個物件共享函式**。而我們訪問類的成員函式是通過類裡面的乙個指標實現,而這個指標指向的是乙個table,table裡面記錄的各個成員函式的位址(當然不同的編譯可能略有不同的實現)。所以我們訪問成員函式是間接獲得位址的。所以這樣也就增加了一定的時間開銷,這也就是為什麼我們提倡把一些簡短的,呼叫頻率高的函式宣告為

inline形式(內聯函式)。

(一)class

cbase

; sizeof(cbase)=

1;為什麼空的什麼都沒有是

1呢?c++要求每個例項在記憶體中都有獨一無二的位址。

//注意這句話!!!!!!!!!!

空類也會被例項化,所以編譯器會給空類隱含的新增乙個位元組,這樣空類例項化之後就有了獨一無二的位址了。所以空類的

sizeof為

1。(二)

class cbase

; sizeof(cbase)=

8;記得對齊的問題。

int 佔

4位元組//注意這點和struct的對齊原則很像!

char佔一位元組,補齊

3位元組(三)

class

cbase

; 再執行:

sizeof(cbase)=

12c++ 類中有虛函式的時候有乙個指向虛函式的指標(vptr),在

32位系統分配指標大小為

4位元組。無論多少個虛函式,只有這乙個指標,

4位元組。

//注意一般的函式是沒有這個指標的,而且也不佔類的記憶體。

(四)class cchild :

public cbase

; 輸出:

sizeof(cchild)=

16;可見子類的大小是本身成員變數的大小加上父類的大小。

//其中有一部分是虛函式表的原因,一定要知道

父類子類共享乙個虛函式指標

(五)#include

class a {};

class

b{};

class

c:public a;

class

d:public b,

public c{};

intmain

()

程式執行的輸出結果為:

sizeof(a) =

1sizeof(b)=

1sizeof(c)=

4sizeof(d)=

8前三種情況比較常見,注意第四種情況。類d的大小更讓初學者疑惑吧,類d是由類b,c派生邇來的,它的大小應該為二者之和

5,為什麼卻是

8 呢?這是因為為了提高例項在記憶體中的訪問效率.類的大小往往被調整到系統的整數倍.並採取就近的法則,裡哪個最近的倍數,就是該類的大小,所以類d的大小為

8個位元組.

總結:空的類是會占用記憶體空間的,而且大小是

1,原因是c++要求每個例項在記憶體中都有獨一無二的位址。

(一)類內部的成員變數:

普通的變數:是要占用記憶體的,但是要注意對齊原則(這點和struct型別很相似)。

static修飾的靜態變數:不占用內容,原因是編譯器將其放在全域性變數區。

(二)類內部的成員函式:

普通函式:不占用記憶體。

虛函式:要占用

4個位元組,用來指定虛函式的虛函式表的入口位址。所以乙個類的虛函式所占用的位址是不變的,和虛函式的個數是沒有關係的。

C 測試類大小中的記憶體對齊問題

為什麼是8啊,把char c注釋掉結果是4,把int a 注釋掉結果是1.但是為什麼在一起就是8了。不明白清前輩指教!以下為對此種現象的解釋 原來是記憶體對齊造成的。英文名叫做memory alignment 大部分16位和32位的cpu不允許將字或者長字儲存到記憶體中的任意位址.比如motorol...

C 類 記憶體對齊和類大小理解

首先,預設的塊對齊長度是4位元組,此外也可以通過 pragma pack x 修改,同時,自己修改完之後記得使用 pragma pack 恢復預設值。此外,又分了幾種情況 1 如果有虛函式,則會儲存虛函式表的位址 僅乙個位址,4位元組或8位元組 該位址是存放在類記憶體的最開始的地方。2 如果出現比x...

C 類中的記憶體對齊

在沒有 pragma pack巨集的情況下 1.資料成員對齊規則 struct,union的資料成員,第乙個資料成員放在offset為0的地方,之後的資料成員的儲存起始位置都是放在該資料成員大小的整數倍位置。如在32bit的機器上,int的大小為4,因此int儲存的位置都是4的整數倍的位置開始儲存。...