C 記憶體對齊

2021-06-29 11:36:42 字數 911 閱讀 7106

請記住三條記憶體規則(在沒有#pragam 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的大小,應該為最大資料成員大小的整數倍。

例項演示:

struct a

;        // 記憶體大小:sizeof(a) = (1+7) + 8 + (4+4) = 24, 補齊[20]...[23]  ----  規則3

struct b

;         // 記憶體大小:sizeof(b) = (4+4) + 24 + (1+7) = 40, 補齊[33]...[39]

*注釋:(1+7)表示該資料成員大小為1,補齊7位;(4+4)同理。

如果把這個例子看懂了,那記憶體對齊就沒有問題了!:)

有#pragam pack巨集的情況下:

如果在**前新增 #pragam pack(1),則 sizeof(a) = 1 + 8 + 4 = 13;  sizeof(b) = 4 + 13 + 1 = 18;   看懂#pragam pack(1)的作用了嗎?告訴編譯器按照1來進行記憶體對齊,即沒有記憶體對齊!

#pragam pack(2),sizeof(a) = ?, sizeof(b) = ? 趕緊實踐下把!

C 記憶體對齊

vc6.0編譯器對記憶體對齊的管理方式遵循以下兩個原則 1.對於結構體內部變數的對齊方式 變數存放的起始位址相對於結構的起始位址的偏移量 char 偏移量必須為sizeof char 即1的倍數 int 偏移量必須為sizeof int 即4的倍數 float 偏移量必須為sizeof float ...

c 記憶體對齊

一.計算struct的size有兩個原則 pragma pack n n是編譯器的對齊位元組數 1 struct中各成員按照對齊原則 在為當前變數 設為a 分配記憶體時,要參考之前所有變數的偏移量之和 設為d d必須是min n,sizeof a 的倍數,否則編譯器會自動在最後補上缺少的位元組數。2...

C 記憶體對齊

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