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