pack 為 struct, union 和 class 等的成員對齊指定字節(jié)邊界. 與編譯選項的 /Zp 開關(guān)不同, 它不針對整個項目, 而僅針對模塊, 比如一個編譯單元.
1. #pragma pack(show)
以警告信息的形式顯示當(dāng)前字節(jié)對齊的值.
2. #pragma pack(n)
將當(dāng)前字節(jié)對齊值設(shè)為 n .
3. #pragma pack()
將當(dāng)前字節(jié)對齊值設(shè)為默認(rèn)值(通常是8) .
4. #pragma pack(push)
將當(dāng)前字節(jié)對齊值壓入編譯棧棧頂.
5. #pragma pack(pop)
將編譯棧棧頂?shù)淖止?jié)對齊值彈出并設(shè)為當(dāng)前值.
6. #pragma pack(push, n)
先將當(dāng)前字節(jié)對齊值壓入編譯棧棧頂, 然后再將 n 設(shè)為當(dāng)前值.
7. #pragma pack(pop, n)
將編譯棧棧頂?shù)淖止?jié)對齊值彈出, 然后丟棄, 再將 n 設(shè)為當(dāng)前值.
8. #pragma pack(push, identifier)
將當(dāng)前字節(jié)對齊值壓入編譯棧棧頂, 然后將棧中保存該值的位置標(biāo)識為 identifier .
9. #pragma pack(pop, identifier)
將編譯棧棧中標(biāo)識為 identifier 位置的值彈出, 并將其設(shè)為當(dāng)前值. 注意, 如果棧中所標(biāo)識的位置之上還有值, 那會先被彈出并丟棄.
10. #pragma pack(push, identifier, n)
將當(dāng)前字節(jié)對齊值壓入編譯棧棧頂, 然后將棧中保存該值的位置標(biāo)識為 identifier, 再將 n 設(shè)為當(dāng)前值.
11. #pragma pack(pop, identifier, n)
將編譯棧棧中標(biāo)識為 identifier 位置的值彈出, 然后丟棄, 再將 n 設(shè)為當(dāng)前值. 注意, 如果棧中所標(biāo)識的位置之上還有值, 那會先被彈出并丟棄.
注意: 如果在棧中沒有找到 pop 中的標(biāo)識符, 則編譯器忽略該指令, 而且不會彈出任何值.
// 代碼段 1: 彈出編譯棧的順序跟壓入的順序相反
#pragma pack(show) // 8 (默認(rèn)值)
#pragma pack(push, 16) // 默認(rèn)值 8 壓入編譯棧棧頂, 并將當(dāng)前對齊值設(shè)為 16 .
#pragma pack(show) // 上句設(shè)定的 16
#pragma pack(push, 4) // 上上句 16 壓入編譯棧棧頂, 并將當(dāng)前對齊值設(shè)為 4 .
#pragma pack(show) // 上句設(shè)定的 4
#pragma pack(push, 2) // 上上句 4 壓入編譯棧棧頂, 并將當(dāng)前對齊值設(shè)為 2 .
#pragma pack(show) // 上句設(shè)定的 2
#pragma pack(push, 1) // 上上句 2 壓入編譯棧棧頂, 并將當(dāng)前對齊值設(shè)為 1 .
#pragma pack(show) // 上句設(shè)定的 1
#pragma pack(pop) // 彈出編譯棧棧頂?shù)?2 , 并將其設(shè)為當(dāng)前對齊值.
#pragma pack(show) // 2
#pragma pack(pop) // 彈出編譯棧棧頂?shù)?4 , 并將其設(shè)為當(dāng)前對齊值.
#pragma pack(show) // 4
#pragma pack(pop) // 彈出編譯棧棧頂?shù)?16 , 并將其設(shè)為當(dāng)前對齊值.
#pragma pack(show) // 16
#pragma pack(pop) // 彈出編譯棧棧頂?shù)?8 , 并將其設(shè)為當(dāng)前對齊值.
#pragma pack(show) // 8
// 代碼段 2: pop 帶有參數(shù) n 時, 當(dāng)前字節(jié)對齊值被設(shè)為了 n, 而不是從棧頂彈出的之前所壓入的值.
#pragma pack(show) // 8 (默認(rèn)值)
#pragma pack(push, 16) // 默認(rèn)值 8 壓入編譯棧棧頂, 并將當(dāng)前對齊值設(shè)為 16 .
#pragma pack(show) // 16
#pragma pack(push, 4) // 上上句 16 壓入編譯棧棧頂, 并將當(dāng)前對齊值設(shè)為 4 .
#pragma pack(show) // 4
#pragma pack(push, 2) // 上上句 4 壓入編譯棧棧頂, 并將當(dāng)前對齊值設(shè)為 2 .
#pragma pack(show) // 2
#pragma pack(push, 1) // 上上句 2 壓入編譯棧棧頂, 并將當(dāng)前對齊值設(shè)為 1 .
#pragma pack(show) // 1
#pragma pack(pop, 8) // 彈出編譯棧棧頂?shù)?2 , 然后丟棄, 再將當(dāng)前對齊值設(shè)為 8 .
#pragma pack(show) // 8
#pragma pack(pop, 1) // 彈出編譯棧棧頂?shù)?4 , 然后丟棄, 再將當(dāng)前對齊值設(shè)為 1 .
#pragma pack(show) // 1
#pragma pack(pop, 2) // 彈出編譯棧棧頂?shù)?16 , 然后丟棄, 再將當(dāng)前對齊值設(shè)為 2 .
#pragma pack(show) // 2
#pragma pack(pop, 16) // 彈出編譯棧棧頂?shù)?8 , 然后丟棄, 再將當(dāng)前對齊值設(shè)為 16 .
#pragma pack(show) // 16
// 代碼段3: push 和 pop 可以帶有標(biāo)識符, 此標(biāo)識符能夠彈出指定值. 但是, 位于棧中指定值之上的那些值均會被彈出并丟棄.
#pragma pack(show) // 8 (默認(rèn)值)
#pragma pack(push, identifier_1, 1) // 默認(rèn)值 8 壓入編譯棧棧頂, 并將棧中 8 對應(yīng)的位置用 identifier_1 標(biāo)識起來, 然后將當(dāng)前對齊值設(shè)為 1 .
#pragma pack(show) // 1
#pragma pack(push, identifier_2, 2) // 上上句 1 壓入編譯棧棧頂, 并將棧中 1 對應(yīng)的位置用 identifier_2 標(biāo)識起來, 然后將當(dāng)前對齊值設(shè)為 2 .
#pragma pack(show) // 2
#pragma pack(push, identifier_3, 4) // 上上句 2 壓入編譯棧棧頂, 并將棧中 2 對應(yīng)的位置用 identifier_3 標(biāo)識起來, 然后將當(dāng)前對齊值設(shè)為 4 .
#pragma pack(show) // 4
#pragma pack(push, identifier_4, 8) // 上上句 4 壓入編譯棧棧頂, 并將棧中 4 對應(yīng)的位置用 identifier_4 標(biāo)識起來, 然后將當(dāng)前對齊值設(shè)為 8 .
#pragma pack(show) // 8
#pragma pack(push, identifier_5, 16) // 上上句 8 壓入編譯棧棧頂, 并將棧中 8 對應(yīng)的位置用 identifier_5 標(biāo)識起來, 然后將當(dāng)前對齊值設(shè)為 16 .
#pragma pack(show) // 16
#pragma pack(push, identifier_6) // 上上句 16 壓入編譯棧棧頂, 并將棧中 16 對應(yīng)的位置用 identifier_6 標(biāo)識起來.
#pragma pack(show) // 16
#pragma pack(pop, identifier_6) // 將標(biāo)識符 identifier_6 對應(yīng)的棧中值 16 彈出, 并將其設(shè)為當(dāng)前對齊值.
#pragma pack(show) // 16
#pragma pack(pop, identifier_5, 2) // 將標(biāo)識符 identifier_6 對應(yīng)的棧中值 8 彈出, 然后丟棄, 再將當(dāng)前對齊值設(shè)為 2 .
#pragma pack(show) // 2
#pragma pack(pop, identifier_1) // 按入棧順序進(jìn)行彈出, 直到遇到標(biāo)識符 identifier_1 標(biāo)識的8 .
#pragma pack(show) // 8