一文讀懂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位元組對齊