一文讀懂sizeof的用法
- 2019 年 10 月 8 日
- 筆記
sizeof
首先是一個操作符,是內置的,不是函數。主要用來求所佔用對象鎖佔用的位元組數。具體使用方式:
sizeof express 或者 sizeof(type) .
以32位為例:
sizeof 基本類型
cout<< sizeof(int) << endl; // 輸出 4 cout<< sizeof(char) << endl; //輸出 1 cout<< sizeof(short) << endl; //輸出 2
sizeof 數組與指針
char chArr[10] = "123"; cout<< sizeof(chArr) << endl; //輸出 10 位元組 整個數組長度是10個位元組 cout<< sizeof(chArr[0]) << endl; // 輸出1 ,char型 1 const char* chPoint = "123"; cout<< sizeof(chPoint) << endl;//輸出4 指針的位元組數 4 int * p; cout<< sizeof(p) << endl;//輸出4 指針的位元組數 4
sizeof struct
關鍵要注意區分位元組對齊,
對齊的兩個原則:
1.佔用空間最大成員變數的位元組數作為對齊方式
2.記憶體按照成員的先後順序來排列。不夠對齊的,補齊位元組即進行padding。
//以結構體內最大的位元組類型對齊 注意區分下面兩種情況: struct St1 { char a;// 1 + padding 3 int b; // 4 + padding 0 short c; // 2 + padding 2 }; // total: 4+4+4 = 12 struct St2 { int a; // 4 + padding 0 char b; // 1 + padding 0 short c; // 2 + padding 1 }; //total:4+1+2 = 8.
sizeof union
union UN{ int a; char b; }; cout<<"UN:" << sizeof(UN) << endl;//輸出4 按照最長的對齊
sizeof class
sizeof對class的時候,用來表示class中所有欄位類型佔用的位元組數,對於空類,默認結果是1.
虛繼承和虛函數都分別佔有一個指針。子類的位元組數包含父類。
//空類 class A{} ;//sizeof(A):1 //繼承 class A1{public : int a ;} ///sizeof A1: 4 class A2 :public A1 {} //sizof A2:4 繼承了A1 的int型位元組數 //帶有static對象的類型 class A3{static int a;} ;//sizeof(A3):1 static存儲在靜態存儲區,不計算在class對象的位元組數內 //虛函數 class B { public: virtual void f(){}; }; //sizeof B : 4 .虛函數里保存一個指向虛表的指針,所以是4. //虛繼承 class D : public virtual B //虛函數 虛繼承 兩個指針 佔有兩個int 位元組 8 { };//sizof D : 8位元組 class E: public virtual B //虛函數 虛繼承 兩個指針 佔有兩個int 位元組 8 { //virtual void f(){}; };//sizof F : 8位元組 class F :public D ,E { //void f(){}; }; //sizof F : 16位元組 繼承自 D 和E的位元組數
pack語句
使用prama pack 可以設定位元組的對齊長度。如:
#pragma pack(4)//設定為4位元組對齊