關於pragma pack的用法(一)

2021-06-16 07:09:03 字數 1445 閱讀 5560

乙個很重要的引數

#pragma pack(n)

資料邊界對齊方式:

以如下結構為例: struct

在windows預設結構大小: sizeof(struct) = 4+4+4+4=16;

與#pragma pack(4)一樣

若設為

#pragma pack(1), 則結構大小: sizeof(struct) = 1+2+4+1=8;

若設為

#pragma pack(2), 則結構大小: sizeof(struct) = 2+2+4+2=10;

在#pragma pack(1)時:空間是節省了,但訪問速度降低了;

結構體對齊的具體含義(#pragma pack)

#pragma pack(4)

class testb

;int nsize = sizeof(testb);

這裡nsize結果為12,在預料之中。

現在去掉第乙個成員變數為如下**:

#pragma pack(4)

class testc

;int nsize = sizeof(testc);

按照正常的填充方式nsize的結果應該是8,為什麼結果顯示nsize為6呢?

事實上,很多人對#pragma pack的理解是錯誤的。

#pragma pack規定的對齊長度,實際使用的規則是:

結構,聯合,或者類的資料成員,第乙個放在偏移為0的地方,以後每個資料成員的對齊,按照#pragma pack指定的數值和這個資料成員自身長度中,比較小的那個進行。

也就是說

,當#pragma pack的值等於或超過所有資料成員長度的時候,這個值的大小將不產生任何效果。

而結構整體的對齊,則按照結構體中最大的資料成員 和 #pragma pack指定值 之間,較小的那個進行。

具體解釋

#pragma pack(4)

class testb

;這個類實際佔據的記憶體空間是9位元組

類之間的對齊,是按照類內部最大的成員的長度,和#pragma pack規定的值之中較小的乙個對齊的。

所以這個例子中,類之間對齊的長度是min(sizeof(int),4),也就是4。

9按照4位元組圓整的結果是12,所以sizeof(testb)是12。

如果#pragma pack(2)

class testb

;//可以看出,上面的位置完全沒有變化,只是類之間改為按2位元組對齊,9按2圓整的結果是10。

//所以 sizeof(testb)是10。

最後看原貼:

現在去掉第乙個成員變數為如下**:

#pragma pack(4)

class testc

;//整個類的大小是5位元組,按照min(sizeof(short),4)位元組對齊,也就是2位元組對齊,結果是8

//所以sizeof(testc)是8。

pragma pack 用法詳解

1.pragma pack show 以警告資訊的形式顯示當前位元組對齊的值.2.pragma pack n 將當前位元組對齊值設為 n 3.pragma pack 將當前位元組對齊值設為預設值 通常是8 4.pragma pack push 將當前位元組對齊值壓入編譯棧棧頂.5.pragma pa...

pragma pack 用法詳解

pack 為 struct,union 和 class 等的成員對齊指定位元組邊界.與編譯選項 屬性 配置屬性 c c 生成 結構成員對齊 的 zp 開關不同,它不針對整個專案,而僅針對模組,比如乙個編譯單元.1.pragma pack show 以警告資訊的形式顯示當前位元組對齊的 值.2.pra...

C語言中的 pragma pack()

這幾天生病了,還沒痊癒,估計要等到下週才能完全復工。pragma的用法為 pragma pra pra是引數。pra有很多種,這裡只說一種。pragma pack 如 progma pack 2 指定按2位元組對齊 struct c progma pack 取消指定對齊,恢復預設對齊 pragma ...