sizeof 不是函數,是編譯期運算符
- 可無括號用於表達式:
sizeof 3;類型須加括號:sizeof(int)。
- 編譯期求值,不產生機器碼:
sizeof(a=3) 不執行賦值,a 不變。
- 不支持鏈式表達式,
sizeof 作用範圍內的代碼不被編譯。
基本類型大小(32 位)
| 類型 | 大小 |
| char | 1 |
| short | 2 |
| int/long | 4 |
| float | 4 |
| double | 8 |
| long double | 10 |
unsigned 不影響大小。
typedef 類型大小等同原型。
指針與函數
- 所有指針大小為 4(32 位平台),與指向類型無關。
sizeof(f()) 等於返回類型大小;sizeof(f) 錯誤(函數非對象)。
數組陷阱
- 靜態數組:
sizeof(arr) = 元素數 × 元素大小。
- 動態數組:
int *p = new int[10]; sizeof(p) == 4(指針大小)。
- 函數參數退化為指針:
void f(int a[]) { sizeof(a) == 4 }。解決:傳遞長度參數或用引用 int (&a)[N]。
字符串:sizeof vs strlen
| 對象 | sizeof | strlen |
char a[]="abc" | 4(含\0) | 3 |
char b[20]="abc" | 20 | 3 |
std::string s="abc" | 類大小(實現相關) | 錯誤(需 s.c_str()) |
sizeof 為編譯期常量,strlen 運行期尋找 \0。推薦用 std::string::size()。
union/struct 對齊與大小
- union 大小 = 最大成員大小,對齊 = 最大成員對齊。
union { char a[13]; int b; } 大小 16(int 4 字節對齊)。
- struct 大小按聲明順序排放,受對齊影響:
struct { char a; double b; int c; char d; } = 24;struct { char a; char b; int c; double d; } = 16。
- 嵌套 struct 對齊以其自身對齊為準,非大小:
struct { char a[8]; } 對齊 1,struct { double d; } 對齊 8。
位域與 double 混用陷阱
struct { int i:8; int j:4; double b; int a:3; } // 24 字節
struct { int i:8; int j:4; int a:3; double b; } // 16 字節
建議:將 float/double 放在結構體首尾,避免干擾位域緊湊排列。
修改對齊:#pragma pack
#pragma pack(2) // 後續結構體按 2 字節對齊
#pragma pack() // 恢復默認
- 上一篇文章: C++ 的 exit 與析構函數:構造函數中調用 exit 導致析構函數不執行
- 下一篇文章: C++ 信徒的摩西十四戒:核心編程準則精華
Copyright ©
程式碼之家 All Rights Reserved