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

#pragma pack 學習筆記

     編輯:關於C語言

#pragma pack 學習筆記

本文原內容為空,僅含標題。#pragma pack 用於控制結構體成員對齊方式,常用於網絡協議、文件格式解析、跨平台數據交換場景。

基本語法 (MSVC / GCC / Clang 通用)


// 設置對齊為 n 字節 (n 為 2 的冪,通常 1, 2, 4, 8, 16)
#pragma pack(push, n)  // 保存當前對齊並設置新值
// 結構體定義...
#pragma pack(pop)      // 恢復之前的對齊設置

核心規則

  1. 有效對齊值 = min(成員大小, #pragma pack 設置值)。
  2. 成員偏移必須是有效對齊值的整數倍。
  3. 結構體總大小必須是有效對齊值的整數倍 (尾部填充)。

經典示例


#pragma pack(push, 1) // 1 字節對齊 (緊湊模式)
struct PackedHeader {
    uint16_t magic;  // 偏移 0
    uint32_t len;    // 偏移 2 (無填充)
    uint8_t  flag;   // 偏移 6
}; // sizeof = 7
#pragma pack(pop)

#pragma pack(push, 4) // 4 字節對齊
struct AlignedHeader {
    uint16_t magic;  // 偏移 0
    uint32_t len;    // 偏移 4 (填充 2 字節)
    uint8_t  flag;   // 偏移 8
}; // sizeof = 12 (尾部填充 3 字節對齊 4)
#pragma pack(pop)

應用場景與注意事項

  • 網絡協議/文件格式:必須用 #pragma pack(1) 確保無填充,配合 static_assert(sizeof(Struct) == Expected) 驗證。
  • 性能權衡:緊湊結構節省內存/帶寬,但可能導致非對齊訪問性能下降或硬件異常 (ARM 早期)。高頻訪問熱點結構體**勿用 pack(1)**。
  • 跨平台一致性:不同編譯器默認對齊可能不同 (如 64 位 Linux GCC 默認 8/16),**務必顯式指定 pack** 而非依賴默認值。
  • C++11 alignas:現代代碼優先用 alignas(n) 增加對齊,#pragma pack 屬編譯器擴展,僅在必須**減小**對齊 (如 pack(1)) 時使用。

提示:原文章內容缺失,此為補充的標準知識點總結。實際開發中請結合具體協議文檔編寫結構體定義並添加靜態斷言驗證大小。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved