首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C++ sizeof 使用規則及陷阱全面解析

     編輯:關於C++

sizeof 不是函數,是編譯期運算符

  • 可無括號用於表達式:sizeof 3;類型須加括號:sizeof(int)。
  • 編譯期求值,不產生機器碼:sizeof(a=3) 不執行賦值,a 不變。
  • 不支持鏈式表達式,sizeof 作用範圍內的代碼不被編譯。

基本類型大小(32 位)

類型大小
char1
short2
int/long4
float4
double8
long double10
  • 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 運行期尋找 \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() // 恢復默認
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
對象sizeofstrlen
char a[]="abc"4(含\0)3
char b[20]="abc"203
std::string s="abc"類大小(實現相關)錯誤(需 s.c_str())