C 類中的記憶體對齊

2021-07-22 16:50:25 字數 1065 閱讀 4015

在沒有#pragma pack巨集的情況下:

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

2.結構體作為資料成員的對齊規則:在乙個struct中包含另乙個struct,內部struct應該以它的最大資料成員大小的整數倍開始儲存。如 struct a 中包含 struct b, struct b 中包含資料成員 char, int, double,則 struct b 應該以sizeof(double)=8的整數倍為起始位址。

3.收尾工作的對齊規則:整個struct的大小,應該為最大資料成員大小的整數倍。

假設在64位機器下

class

test1

sizeof(test1) = 16

class

test2

sizeof(test2) = 2 + (6) + 8 + 16 + 1 + (7) = 40

c++中資料型別的長度並不是簡單根據機器字長確定的。其實還是由編譯器決定的,所以在很多64位機器上int仍然是32位字長。所以很多時候要根據具體情況具體分析,更多情況下兩者的基礎資料型別是等長的。

指標比較特殊,指標是用於定址的,64位下都是64位,而32位下為32位。指標的大小應該是和作業系統字長統一了的。所以在上面的例子中,64位機器下int*的大小是8位元組,如果是32位下就應該是4位元組。

巨集pragma pack可以遮蔽掉編譯器預設的對齊方式,而自己設定對齊大小。

在上面的例子中,如果加上這個巨集將會是如下的情況:

#pragma pack(1)

//以1位元組對齊

//sizeof(test1) = 13

//sizeof(test2) = 24

#pragma pack(2)

//以2位元組對齊

//sizeof(test1) = 14

//sizeof(test2) = 26

C 類的記憶體對齊

記憶體對齊。對下面的類 class b 大家可以猜一下類 b物件的大小。如果你猜是18 4 2 8 4 也不能說你錯。但是你用 sizeof b 一看,結果竟然是 24!多出來的 6個位元組是怎麼回事呢?其實是記憶體對齊搞的鬼。在編譯器的結構成員對齊設定為預設的情況下,分配給各個成員變數的記憶體大小...

C 類的記憶體對齊 C alignment

在c 中的某乙個類的記憶體大小是由以下三部分組成 1 nonstatic data member的總和大小 2 alignment所填補的空間,可能存在於members之間,也可能是類的邊界 3 為了支援virtual而由內部產生的額外負擔,比如 指虛基類表的指標或指向虛函式表的指標 其中1和3都比...

C 中的記憶體對齊

記憶體對齊 在我們的程式中,資料結構還有變數等等都需要占有記憶體,在很多系統中,它都要求記憶體分配的時候要對齊,這樣做的好處就是可以提高訪問記憶體的速度。我們還是先來看一段簡單的程式 程式一 1 include 2using namespace std 34 structx15 1011struct...