pragma pack 預設對齊方式

2021-09-21 00:23:53 字數 614 閱讀 3880

一般的pack對齊格式分別是1,2,4,8,16.

預設的對齊格式,也就是:#pragma

pack()

情況下,會在結構體中挑選占用位元組最多的型別,例如double 占用8個位元組,例子:

#pragma

pack()

struct a

;上面的結構體長度是16.為什麼是16,而不是char 8 int 8 double 8

實際上,當我們採用預設的對齊,決定儲存的長度是8個位元組,所以每8個位元組為一組,存放資料,但是可能像上面的情況是乙個位元組的字元,占用了1個位元組的儲存空間,編譯器嘗試利用剩餘的7個空,避免讀取暫存器數值 的時候,從奇數的位置開始讀取資料。所以跳過了乙個1個位元組。發現下乙個元素剛好可以填充從第3個位元組開始的位置,所以填充。現在位置移動到了第5個位元組,還剩下4個位元組,這一組就分配完畢了,此時遇到了乙個整型,剛剛好。

如果指定了位元組對齊的個數,情況就會不一樣:

#pragma

pack(1)

struct a

;變成了14個位元組。

總結如下:如果沒有指定位元組對齊,挑選位元組長度最長的型別作為對齊的位元組數。然後分配對齊位元組數的空間,嘗試將結構體的成員,往裡面塞,注意存在的開始位址必須是偶數。

位元組對齊 pragma pack

這是給編譯器用的引數設定,有關結構體位元組對齊方式設定,pragma pack是指定資料在記憶體中的對齊方式。pragma pack n 作用 c編譯器將按照n個位元組對齊。pragma pack 作用 取消自定義位元組對齊方式。pragma pack push,1 作用 是指把原來對齊方式設定壓棧...

C 位元組對齊 pragma pack

對於結構體,編譯器會自動進行成員變數對齊處理,是為了提高運算效率。預設情況下是自然對齊方式。即預設對齊,按照結構體的成員中size最大的成員進行對齊。例 struct naturalalign 上述結構體,成員size最大的是c,sizeof c 為4,因此,結構體中的成員都以4為單位進行對齊,si...

pragma pack和記憶體對齊

記憶體對齊和cpu有關係,可以認為記憶體對齊的大小就是cpu一次讀取記憶體的大小,例如32cpu一次讀取4位元組,那麼記憶體的對齊方式就4位元組,64位就是8位元組。本質上是保證cpu使用盡量少的次數將某乙個變數取出來。關於結構體內存對齊的方式,只需要把握兩點即可 上面說了,編譯預設對齊方式是4位元...