首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

C++ #pragma pack 成對使用指南:避免跨檔案記憶體對齊衝突

     編輯:C++ 入門

C++ #pragma pack 成對使用指南

#pragma pack 控制結構體/聯集成員的記憶體對齊值(1,2,4,8,16)。在標頭檔中使用時必須成對呼叫,否則會汙染引用該標頭檔的其他原始檔,導致結構體大小計算錯誤、指標偏移錯誤,嚴重時引發非法記憶體存取或程式崩潰。

1. 基本成對模式 #pragma pack(n) / #pragma pack()

// header1.h
#pragma pack(1)               // 設定 1 位元組對齊
struct S1 { int i; char c; bool f; };
// struct S2 { ... }
#pragma pack()                // 恢復預設對齊(與開頭配對)

2. 堆疊模式 #pragma pack(push, n) / #pragma pack(pop)(推薦)

// header2.h
#pragma pack(push, 1)         // 將當前對齊值壓入堆疊,設為 1
struct S3 { int i; char c; bool f; };
// struct S4 { ... }
#pragma pack(pop)             // 彈出堆疊,還原先前對齊值

堆疊模式支援巢狀、多元件整合,更安全。

3. MSDN 官方語法說明(節錄)

#pragma pack( [n] )                    // n = 1,2,4,8,16
#pragma pack( [ [ { push | pop } [, identifier ] ] [, n ] ] )
  • push:將目前對齊值存入內部編譯器堆疊;可選 identifier 命名。
  • pop:從堆疊彈出還原;若指定 identifier 則彈出至該標記。
  • 預設對齊值為 8(/Zp8)。

4. 實務建議

  • 標頭檔務必在結構定義前後成對使用 push/pop。
  • 避免單獨用 #pragma pack(n) 不還原,除非該檔為獨立編譯單元且確定無副作用。
  • 跨平台專案建議改用 C++11 alignas / 屬性 __attribute__((packed)) 等標準化寫法。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved