關於記憶體對齊問題 二

2021-06-04 20:39:23 字數 1622 閱讀 7334

乙個類的物件到底有多大?其大小由什麼因素影響?

我們假定這個類沒有繼承任何其他類,且沒有虛函式。先看下面例子:

#include

using namespace std;

class concrete

private:

int val;

char c1;

char c2;

//char c3;

};

int main(void)

執行上面的程式,不管是否有成員變數

c3,輸出結果均為

8,為什麼呢?

由於記憶體的

alignment

的原因,所有物件的大小為

4bytes

的整數倍

(因為其資料成員的資料型別最大占用位元組數為4,即

sizeof(int val) = 4)

,不足的就填充,如下面的圖示。

(有成員變數

c3的情況

)(沒有成員變數

c3的情況)

出現在

derived class

中的base class subobject保持其完成原樣性

請看下面例子:

#include

using namespace std;

class concrete1

};

class concrete2 : public concrete1

};

class concrete3 : public concrete2

};

int main(void)

輸出會是多少呢?類

concrete3和1)

中的類concrete

完成的功能一模一樣,但是

concrete3

的物件的空間確變成了

16bytes

,比原來的整整多出一倍!原因就是

c++語言保證「出現在

derived class

中的base class suboject

有其完整性」。**如下:

在上圖中

concrete2

型別的物件中,為什麼也要填充

3bytes

呢?這還是因為繼承了

concrete1

的緣故。正是因為繼承了

concrete1

中的int val

,因此concrete2

的對齊數變成了

4 bytes

,因此必須要填充

3 bytes

。總結如下:

其一,c++

語言保證「出現在

derived class

中的base class suboject

有其完整性」;

其二,derived class

的對齊數

= min(

指定的全域性對齊數,

max(base class

的對齊數,

derived class

的對齊數))

**

關於記憶體對齊

資料傳送到網路板的資料報大小根本不是實際控制數 據包的大小 這時我才想起乙個人,stanley b.lippman,他寫的那 一本書 inside object modale 曾經提過這樣的事 情,編譯器為了提高cpu的效率,會對struct 的結構進行優化,利用sizeof 可以得出不同的計算機上...

關於記憶體對齊

早上看了乙個貼的面試題,struct st int i short s char c sizeof struct st 是多少?int 4,short 2,char 1,但是sizeof st 是8。這個就是記憶體對齊 再來看個例子 struct strt1 strt1 s1 假設s1.c1位址為0...

關於記憶體對齊

資料傳送到網路板的資料報大小根本不是實際控制資料報的大小 這時我才想起乙個人,stanley b.lippman,他寫的那一本書 inside object modale 曾經提過這樣的事情,編譯器為了提高cpu的效率,會對struct 的結構進行優化,利用sizeof 可以得出不同的計算機上對 s...