size_t(unsigned int)。sizeof(類型) 必加括號;sizeof 變量 可不加。void、位域。| 類型 | 典型大小 |
|---|---|
| char/signed char/unsigned char | 1 |
| short | 2 |
| int/long/float | 4 |
| double | 8 |
| long double | 10/12/16 |
| 指針 | 32位=4, 64位=8 |
struct MyStruct {
double dda1; // 8 字節,偏移 0(8 的倍數)
char dda; // 1 字節,偏移 8(1 的倍數)
int type; // 4 字節,偏移 9→填充 3 字節→偏移 12(4 的倍數)
}; // 目前 16 字節,已是最大成員 8 的倍數,無尾部填充
// sizeof(MyStruct) = 16
若調整順序:
struct Better {
double dda1; // 0
int type; // 8 (8 的倍數)
char dda; // 12
}; // 總 13 → 尾部填充 3 → 16
// 同樣 16,但中間填充從 3 變 0,尾部填充 3
| 類型 | 對齊倍數 |
|---|---|
| char | 1 |
| short | 2 |
| int/long/float | 4 |
| double | 8 |
#pragma pack(n):指定最大對齊數(1/2/4/8/16),成員對齊取 min(類型大小, n)。__declspec(align(n)):強制結構體/變量按 n 字節對齊。sizeof(arr) 得全大小;函數參數退化為指針得指針大小。sizeof(expr) 得表達式結果類型大小,不求值(sizeof(f()) 不調用 f)。sizeof(p) 永遠是指針大小,無法得知分配大小。涉及位元組大小計算(
malloc/memcpy/fread/數組元素數)一律用 sizeof,拒絕魔術數字,保證跨平台可移植。