跳轉到內容

C++ 程式設計

來自華夏公益教科書,開放的書籍,開放的世界

sizeof 關鍵字指的是一個在編譯時工作的運算子,它報告傳遞給它的型別所佔儲存空間的大小(等效於該型別變數的大小)。該大小以字元大小的倍數返回,在許多個人電腦上為 1 位元組(或 8 位)。字元中的位數儲存在 <climits> 標頭檔案中定義的 CHAR_BIT 常量中。這是運算子過載不允許的運算子之一。

//Examples of sizeof use
int int_size( sizeof( int ) );// Might give 1, 2, 4, 8 or other values.

// or

int answer( 42 );
int answer_size( sizeof( answer ) );// Same value as sizeof( int )
int answer_size( sizeof answer);    // Equivalent syntax

例如,以下程式碼使用 sizeof 來顯示多個變數的大小

 
    struct EmployeeRecord {
      int ID;
      int age;
      double salary;
      EmployeeRecord* boss;
    };
 
    //...
 
    cout << "sizeof(int): " << sizeof(int) << endl
         << "sizeof(float): " << sizeof(float) << endl
         << "sizeof(double): " << sizeof(double) << endl
         << "sizeof(char): " << sizeof(char) << endl
         << "sizeof(EmployeeRecord): " << sizeof(EmployeeRecord) << endl;
 
    int i;
    float f;
    double d;
    char c;
    EmployeeRecord er;
 
    cout << "sizeof(i): " << sizeof(i) << endl
         << "sizeof(f): " << sizeof(f) << endl
         << "sizeof(d): " << sizeof(d) << endl
         << "sizeof(c): " << sizeof(c) << endl
         << "sizeof(er): " << sizeof(er) << endl;

在大多數機器上(考慮字元的大小),上面的程式碼顯示以下輸出

 
    sizeof(int): 4
    sizeof(float): 4
    sizeof(double): 8
    sizeof(char): 1
    sizeof(EmployeeRecord): 20
    sizeof(i): 4
    sizeof(f): 4
    sizeof(d): 8
    sizeof(c): 1
    sizeof(er): 20

同樣重要的是要注意,各種型別變數的大小會根據您所處的系統而變化。檢視資料型別頁面瞭解更多資訊。

語法上,sizeof 在獲取型別大小的時候看起來像一個函式呼叫,但在獲取變數型別大小的時候可以使用括號(例如 sizeof(int))。如果引數是變數或陣列,則可以省略括號(例如 sizeof xsizeof myArray)。關於在後一種情況下是否應該使用省略括號的餘地,風格指南有所不同。

考慮下面的例子

    #include <cstdio>

    short func( short x )
    {
      printf( "%d", x );
      return x;
    }

    int main()
    {
      printf( "%d", sizeof( sizeof( func(256) ) ) );
    }

由於 sizeof 在執行時不評估任何內容,因此 func() 函式永遠不會被呼叫。所有需要的資訊都是函式的返回型別,第一個 sizeof 將返回一個 short(函式的返回型別)的大小,值為 2(在 size_t 中,一個在包含檔案 STDDEF.H 中定義的整數型別),第二個 sizeof 將返回 4(第一個 sizeof 返回的 size_t 的大小)。

sizeof 測量一個物件的大小,就簡單的連續儲存區域而言;對於包含指向其他儲存區的指標的型別,間接儲存區包含在 sizeof 返回的值中。C++ 程式設計新手常犯的一個錯誤是試圖使用 sizeof 來確定一個字串的長度;std::strlen或者std::string::length函式更適合於此任務。

sizeof 在最近幾年也得到了新的應用,在模板超程式設計中,它可以將型別轉換為數字,儘管方式比較原始,但通常非常有用,因為模板超程式設計環境通常使用型別進行大部分計算。

華夏公益教科書