sizeof 是 C/C++ 核心運算子,編譯期計算型別或運算式的位元組大小,回傳 size_t。本文系統涵蓋基本型別、指標、陣列、結構體/類別對齊、虛函式表、空類別等進階主題,並對比 C/C++ 差異。
sizeof(type) // 型別需括號
sizeof expr // 運算式可無括號,不求值
sizeof var // 變數可無括號
sizeof(func()) 不會呼叫 func(),只取回傳型別大小。| 型別 | 32位系統 | 64位系統 |
|---|---|---|
| char / signed char / unsigned char | 1 | 1 |
| short | 2 | 2 |
| int | 4 | 4 |
| long | 4 | 8 (Linux) / 4 (Windows) |
| long long | 8 | 8 |
| float / double / long double | 4 / 8 / 12-16 | 同上 |
| 所有指標 | 4 | 8 |
int a[10];
sizeof(a); // 40 (完整陣列大小)
sizeof(a[0]); // 4 (單元素大小)
int *p = a;
sizeof(p); // 4/8 (指標大小)
sizeof(*p); // 4 (指向型別大小)
void func(int arr[10]) {
sizeof(arr); // 4/8 ! 參數退化為指標
}
三大準則:
struct S1 { char c; int i; }; // 1 + 3填充 + 4 = 8
struct S2 { int i; char c; }; // 4 + 1 + 3填充 = 8
struct S3 { char c1; S1 s; char c2; }; // 1 + 3填充 + 8 + 1 + 3填充 = 16
工具:offsetof(S, member) 取得成員偏移量 (編譯期常數)。
class A { int a; float b; char c; }; // 12 (對齊)
class B { static int s; int a; }; // 4 (s不計入)
class C { virtual void f(); int a; }; // 8/16 (vptr + a + 填充)
class D : virtual public C { int d; }; // 複雜,含 vbptr
sizeof(arr)/sizeof(arr[0]) (僅適用非退化陣列)。p = malloc(n * sizeof(*p))。static_assert(sizeof(T) == 16, "layout changed");。#pragma pack(1) 或 `__attribute__((packed))`,慎用 (可能降低存取效能、觸發硬體異常)。