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

C++ 內存對齊規則深度解析:結構體大小計算與 #pragma pack 控制

     編輯:關於C++

什麼是內存對齊?

結構體成員在內存中並非緊密排列,而是按特定規則對齊,以便 CPU 高效訪問。對齊可能在成員間插入填充字節。

基本規則(64 位系統,默認對齊數 8)

  1. 成員對齊:每個成員偏移量必須是 min(成員大尺寸, 默認對齊數) 的倍數。
  2. 整體對齊:結構體總大小必須是 max(最大成員大小, 默認對齊數) 的倍數,不足則尾部填充。
  3. #pragma pack(n) 可調小默認對齊數(n ∈ {1,2,4,8,16}),不能調大。

實例演示

// 64位系統,默認對齊 8
struct A { int a; long b; };   // a:4, 填充4, b:8 => size=16
struct B { long a; int b; };   // a:8, b:4, 填充4 => size=16
#pragma pack(4)
struct C { long a; int b; };   // a:8 (min(8,4)=4 對齊? 實際 long 仍 8 字節對齊? 視編譯器)
#pragma pack()
// 巢狀結構體:內部結構體對齊數決定外部成員對齊
struct Inner { char a,b,c; };  // size=3, align=1
struct Outer { Inner x,y,z; }; // size=9, align=1
struct Inner2 { short a; char b; }; // size=4, align=2
struct Outer2 { Inner2 x,y,z; };    // size=12, align=2

關鍵細節

  • 指標成員:指標大小(8 字節)決定對齊,指向的數據位置不影響。
  • 空類/空結構體:C++ 標準規定大小至少為 1,但作為成員時可能被優化(EBO)。
  • alignas(C++11)可指定更嚴格對齊:alignas(16) int arr[4];。
  • offsetof 宏可獲取成員偏移量,驗證對齊效果。

對齊對性能的影響

  • 正確對齊:單指令訪問,速度最快。
  • 未對齊:x86 允許但較慢;ARM/MIPS 可能觸發硬件異常。
  • 過度對齊:浪費內存,降低緩存命中率。

總結

掌握「成員對齊 → 整體對齊 → pack 控制」三步法,配合 sizeof/offsetof 實測,即可精準預測結構體內存佈局。網絡協議、文件格式、共享內存等場景務必顯式控制對齊。

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