C/C++ 標準僅規定類型的 最小範圍,實際 sizeof 隨平台(ILP32/LP64/LLP64)、編譯器、架構而異。本文匯總 Windows/Linux/Solaris 主流環境的實測數據,並提供自動生成對照表的程式碼,助你寫出可移植的序列化、網路協議、嵌入式代碼。
| 類型 | Win2K VC | Win2K Dev-C++ / Ubuntu GCC | Sun Ultra10 Solaris GCC (32-bit) |
|---|---|---|---|
char | 1 | 1 | 1 |
int | 4 | 4 | 4 |
long int | 4 | 4 | 4 |
float | 4 | 4 | 4 |
double | 8 | 8 | 8 |
long double | 8 | 12 | 16 |
double* | 4 | 4 | 4 |
char* | 4 | 4 | 4 |
long/指標 8 字節,LLP64 (Windows x64) 下 long 仍為 4 字節。int、long 在 32 位系統通常同寬,但不可假設永遠相等。#include <stdio.h>
int main() {
char c; int i; long int j; float k; double l; long double m;
char *cp; double *lp;
#define P(t, v) printf("[%s] Size Total:%zu\n", #t, sizeof(v))
P(char, c); P(int, i); P(long int, j); P(float, k);
P(double, l); P(long double, m);
P(double point, cp); P(char point, lp);
return 0;
}
編譯執行即可獲得當前環境精確數據。建議專案 CMake 中加入 check_type_size() 自動記錄。
<cstdint> 固定寬度類型:int32_t, uint64_t, intptr_t。long double 僅用於本地高精度中間運算,落地存儲/傳輸轉為 double 或十進制字串。#pragma pack 或 alignas 顯式控制,配合 static_assert(sizeof(T) == N) 編譯期斷言。把這張表存進團隊 Wiki,下次跨平台移植或定義協議結構時,就能少踩無數「sizeof 假設一致」的坑。