pragma pack 用法詳解

2021-06-22 20:41:53 字數 4425 閱讀 7962

pack 為 struct, union 和 class 等的成員對齊指定位元組邊界. 與編譯選項(屬性 -> 配置屬性 -> c/c++ ->**生成 -> 結構成員對齊)的 /zp 開關不同, 它不針對整個專案, 而僅針對模組, 比如乙個編譯單元.

1. #pragma pack(show)

以警告資訊的形式顯示當前位元組對齊的

值.2. #pragma pack(n)

將當前位元組對齊值設為 n .

3. #pragma pack()

將當前位元組對齊值設為預設值(通常是8) .

4. #pragma pack(push)

將當前位元組對齊值壓入編譯棧棧頂.

5. #pragma pack(pop)

將編譯棧棧頂的位元組對齊值彈出並設為當前值

.6. #pragma 

pack(push, n)

先將當前位元組對齊值壓入編譯棧棧頂, 然後再將 n 設為當前值.

7. #pragma pack(pop, n)

將編譯棧棧頂的位元組對齊值彈出, 然後丟棄, 再將 n 設為當前值.

8. #pragma pack(push, identifier)

將當前位元組對齊值壓入編譯棧棧頂, 然後將棧中儲存該值的位置標識為 identif

ier .

9. #pragma pack(pop, identifier)

將編譯棧棧中標識為 identifier 位置的值彈出, 並將其設為當前值. 注意, 如果棧中所標識的位置之上還有值, 那會先被彈出並丟棄.

10. #pragma pack(push, identifier, n)

將當前位元組對齊值壓入編譯棧棧頂, 然後將棧中儲存該值的位置標識為 identifier, 再將 n 設為當前值.

11. #pragma pack(pop, identifier, n)

將編譯棧棧中標識為 identifier 位置的值彈出, 然後丟棄, 再將 n 設為當前值. 注意, 如果棧中所標識的位置之上還有值, 那會先被彈出並丟棄.

注意: 如果在棧中沒有找到 pop 中的識別符號, 則編譯器忽略該指令, 而且不會彈出任何值.

// **段 1: 彈出編譯棧的順序跟壓入的順序相反

#pragma pack(show) 

// 8 (預設值)

#pragma pack(push, 16) // 預設值 8 壓入編譯棧棧頂, 並將當前對齊值設為 16 .

#pragma pack(show) 

// 上句設定的 16

#pragma pack(push, 4) 

// 上上句 16 壓入編譯棧棧頂, 並將當前對齊值設為 4 .

#pragma pack(show) 

// 上句設定的 4

#pragma pack(push, 2) 

// 上上句 4 壓入編譯棧棧頂, 並將當前對齊值設為 2 .

#pragma pack(show) 

// 上句設定的 2

#pragma pack(push, 1) 

// 上上句 2 壓入編譯棧棧頂, 並將當前對齊值設為 1 .

#pragma pack(show) 

// 上句設定的 1

#pragma pack(pop) 

// 彈出編譯棧棧頂的 2 , 並將其設為當前對齊值.

#pragma pack(show) 

// 2

#pragma pack(pop) 

// 彈出編譯棧棧頂的 4 , 並將其設為當前對齊值.

#pragma pack(show) 

// 4

#pragma pack(pop) 

// 彈出編譯棧棧頂的 16 , 並將其設為當前對齊值.

#pragma pack(show) 

// 16

#pragma pack(pop) 

// 彈出編譯棧棧頂的 8 , 並將其設為當前對齊值.

#pragma pack(show) 

// 8

// **段 2: pop 帶有引數 n 時, 當前位元組對齊值被設為了 n, 而不是從棧頂彈出的之前所壓入的值.

#pragma pack(show) 

// 8 (預設值)

#pragma pack(push, 16) // 預設值 8 壓入編譯棧棧頂, 並將當前對齊值設為 16 .

#pragma pack(show) 

// 16

#pragma pack(push, 4) 

// 上上句 16 壓入編譯棧棧頂, 並將當前對齊值設為 4 .

#pragma pack(show) 

// 4

#pragma pack(push, 2) 

// 上上句 4 壓入編譯棧棧頂, 並將當前對齊值設為 2 .

#pragma pack(show) 

// 2

#pragma pack(push, 1) 

// 上上句 2 壓入編譯棧棧頂, 並將當前對齊值設為 1 .

#pragma pack(show) 

// 1

#pragma pack(pop, 8) 

// 彈出編譯棧棧頂的 2 , 然後丟棄, 再將當前對齊值設為 8 .

#pragma pack(show) 

// 8

#pragma pack(pop, 1) 

// 彈出編譯棧棧頂的 4 , 然後丟棄, 再將當前對齊值設為 1 .

#pragma pack(show) 

// 1

#pragma pack(pop, 2) 

// 彈出編譯棧棧頂的 16 , 然後丟棄, 再將當前對齊值設為 2 .

#pragma pack(show) 

// 2

#pragma pack(pop, 16) 

// 彈出編譯棧棧頂的 8 , 然後丟棄, 再將當前對齊值設為 16 .

#pragma pack(show) 

// 16

// **段3: push 和 pop 可以帶有識別符號, 此識別符號能夠彈出指定值. 但是, 位於棧中指定值之上的那些值均會被彈出並丟棄. 

#pragma pack(show) 

// 8 (預設值)

#pragma pack(push, identifier_1, 1) 

// 預設值 8 壓入編譯棧棧頂, 並將棧中 8 對應的位置用 identifier_1 標識起來, 然後將當前對齊值設為 1 .

#pragma pack(show) 

// 1

#pragma pack(push, identifier_2, 2) 

// 上上句 1 壓入編譯棧棧頂, 並將棧中 1 對應的位置用 identifier_2 標識起來, 然後將當前對齊值設為 2 .

#pragma pack(show) 

// 2

#pragma pack(push, identifier_3, 4) 

// 上上句 2 壓入編譯棧棧頂, 並將棧中 2 對應的位置用 identifier_3 標識起來, 然後將當前對齊值設為 4 .

#pragma pack(show) 

// 4

#pragma pack(push, identifier_4, 8) 

// 上上句 4 壓入編譯棧棧頂, 並將棧中 4 對應的位置用 identifier_4 標識起來, 然後將當前對齊值設為 8 .

#pragma pack(show) 

// 8

#pragma pack(push, identifier_5, 16) // 上上句 8 壓入編譯棧棧頂, 並將棧中 8 對應的位置用 identifier_5 標識起來, 然後將當前對齊值設為 16 .

#pragma pack(show) 

// 16

#pragma pack(push, identifier_6) 

// 上上句 16 壓入編譯棧棧頂, 並將棧中 16 對應的位置用 identifier_6 標識起來.

#pragma pack(show) 

// 16

#pragma pack(pop, identifier_6) 

// 將識別符號 identifier_6 對應的棧中值 16 彈出, 並將其設為當前對齊值.

#pragma pack(show) 

// 16

#pragma pack(pop, identifier_5, 2) 

// 將識別符號 identifier_6 對應的棧中值 8 彈出, 然後丟棄, 再將當前對齊值設為 2 .

#pragma pack(show) 

// 2

#pragma pack(pop, identifier_1) 

// 按入棧順序進行彈出, 直到遇到識別符號 identifier_1 標識的8 .

#pragma pack(show) 

// 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的用法(一)

乙個很重要的引數 pragma pack n 資料邊界對齊方式 以如下結構為例 struct 在windows預設結構大小 sizeof struct 4 4 4 4 16 與 pragma pack 4 一樣 若設為 pragma pack 1 則結構大小 sizeof struct 1 2 4 ...

位元組對齊 pragma pack

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