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

#pragma pack(n) 完全指南:結構體記憶體對齊控制與面試經典題解析

     編輯:關於C語言

結構體成員在記憶體中並非緊密排列,編譯器依自然對齊規則插入填充位元組。#pragma pack(n) 允許開發者指定最大對齊邊界,影響結構體大小與成員偏移。

對齊基本規則

  1. 第一個成員偏移為 0
  2. 每個成員偏移必須是 min(成員大小, 指定對齊值) 的倍數
  3. 結構體總大小必須是 所有成員有效對齊值的最大值 的倍數 (尾部填充)

#pragma pack 語法


#pragma pack(8)   /* 設定 8 位元組對齊 */
struct MyStruct { ... };
#pragma pack()    /* 恢復預設對齊 */

n 通常為 1, 2, 4, 8, 16。GCC/Clang 亦支援 __attribute__((packed))、__attribute__((aligned(n)))。

經典面試題逐步解析


#pragma pack(8)
struct S1 { short a; long b; };   // short=2, long=4
struct S2 { char c; S1 d; long long e; }; // long long=8
#pragma pack()

步驟 1:分析 S1 (指定對齊 8)

  • a (short, 2 bytes):有效對齊 = min(2,8)=2 → 偏移 0,佔 0-1
  • b (long, 4 bytes):有效對齊 = min(4,8)=4 → 偏移 4 (0-1 後補 2 bytes 填充),佔 4-7
  • S1 當前大小 8,最大有效對齊 4 → 尾部填充至 4 的倍數 (已是 8) → sizeof(S1)=8

步驟 2:分析 S2 (指定對齊 8)

  • c (char, 1 byte):有效對齊 = min(1,8)=1 → 偏移 0
  • d (S1, 8 bytes):S1 最大有效對齊為 4 → 有效對齊 = min(4,8)=4 → 偏移 4 (補 3 bytes),佔 4-11
  • e (long long, 8 bytes):有效對齊 = min(8,8)=8 → 偏移 16 (12-15 補 4 bytes),佔 16-23
  • S2 最大有效對齊 8,當前大小 24 已是 8 的倍數 → sizeof(S2)=24

記憶體佈局圖解

S1:  [a:2][pad:2][b:4]           = 8 bytes
S2:  [c:1][pad:3][d:8][pad:4][e:8] = 24 bytes
      0     4       12      16      24

三大核心原則總結

  1. 成員各自對齊:各按 min(自身大小, pack值) 對齊
  2. 巢狀結構對齊:以其成員中最大有效對齊值 為準
  3. 整體大小圓整:結構體大小必為最大有效對齊值的倍數

陷阱提醒

  • 陣列對齊遵循元素類型,非陣列總大小
  • typedef char A[3]; 對齊仍為 1,非 3
  • 不同編譯器預設 pack 值可能不同 (MSVC 預設 8, GCC 預設 4/8)
  • 網路協定、硬體暖存器映射、跨平台資料交換常需 #pragma pack(1)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved