結構體 (struct) 是 C 語言**用戶自定義類型**,由基本類型組合而成。定義方式三種:
// 1. 定義類型同時定義變量
struct Student { char name[20]; int age; } s1, s2;
// 2. 先定義類型,再定義變量
struct Teacher { char name[20]; int id; };
struct Teacher t1, t2;
// 3. typedef 別名 (最常用)
typedef struct { char name[20]; int score; } Score;
Score sc1 = {"Math", 95};
// 順序初始化 (C99 指定初始化器更安全)
struct Point { int x, y; };
struct Point p1 = {10, 20};
struct Point p2 = {.y = 30, .x = 40}; // C99 指定初始化,順序無關
// 靜態/全局變量未顯式初始化自動零初始化
static struct Point p3; // {0, 0}
struct Demo { char c; int i; }; // 假設 32 位系統:char=1, int=4
// 預期 5,實際 sizeof = 8
地址偏移: 0 1 2 3 4 5 6 7
內容: c [pad] [pad] [pad] i i i i
↑ ↑
offset=0 offset=4 (4 的倍數)
總大小 8 = 4 的倍數 (最寬成員 int=4)
#pragma pack(n) 與 __attribute__((aligned(n)))| 方式 | 語法 | 作用域 | 備註 |
|---|---|---|---|
| MSVC / GCC/Clang 通用 | #pragma pack(push, 1) ... #pragma pack(pop) | 源文件範圍 | n=1 表示 1 字節對齊 (緊湊),n=2/4/8/16 |
| GCC/Clang 屬性 | struct __attribute__((packed, aligned(4))) S { ... }; | 單個結構體 | packed 取消所有填充,aligned 指定最小對齊 |
| C11 標準 | _Alignas(8) struct S { ... }; | 單個結構體/成員 | 僅能**增大**對齊,不能縮小 |
#pragma pack(push, 1)
typedef struct {
uint16_t magic; // 0xA5A5
uint8_t version; // 1
uint8_t cmd; // 命令碼
uint32_t length; // 數據長度
uint32_t seq; // 序列號
} ProtoHeader;
#pragma pack(pop)
// 驗證
static_assert(sizeof(ProtoHeader) == 11, "Protocol header size mismatch");
std::atomic / 鎖自由算法要求變量自然對齊 (通常 4/8 字節)。
// 未優化: 24 字節 (64 位系統, 雙指針 8 字節對齊)
struct Bad { char c; double d; int i; char c2; long l; };
// 優化: 按類型大小降序排列 -> 16 字節
struct Good { double d; long l; int i; char c; char c2; };
// 佈局: d(8) + l(8) = 16, 結尾無需尾部填充
**原則**:聲明順序按 sizeof(類型) **從大到小** 排列,相同大小分組,可最小化 Padding。
sizeof(struct) ≥ 成員大小之和,差值為 Padding。#pragma pack / 屬性控制對齊,**跨平台協議必須顯式指定**。