sizeof本身是C語言的一個運算符,但也被C++支援,且很多C++代碼中經常會出現。
sizeof可以很容易計算一個數組的長度,這在數組作為參數的函數中很有用(數組作為函數參數,傳入的其實是首元素的位址,必須帶上數組的實際長度作為另一個參數才行)。
請看下面代碼(visual stadio 2019環境編譯,unicode字元集,x64程式):
#include <iostream>
int main()
{
using namespace std;
int iValue = 10;
cout << "int:" << sizeof(iValue) << endl;
int array_int[] = { 1, 2, 3 };
cout << "array_int:" << sizeof(array_int) << endl;
char chChar = 'a';
cout << "char:" << sizeof(chChar) << endl;
char array_char[] = { 'a', '是', 'c' };
cout << "array_char:" << sizeof(array_char) << endl;
wchar_t wcChar = L'a';
cout << "wchar:" << sizeof(wcChar) << endl;
wchar_t array_wchar[] = { L'a', L'是', L'c' };
cout << "array_wchar_t:" << sizeof(array_wchar) << endl;
const char* pEnglish = "hello";
cout << "char*_en:" << sizeof(pEnglish) << endl;
const char* pChinese = "中文";
cout << "char*_zh:" << sizeof(pChinese) << endl;
int* pInt = new int(10);
cout << "int*:" << sizeof(pInt) << endl;
system("pause");
return 0;
}
首先,編譯時便會有一下警告:
問題出在這一句:char array_char[] = { 'a', '是', 'c' };
為何會有警告?這裡涉及到另一個編碼問題,此處先不說,後面有機會再寫一篇文章說明。
執行結果如下:
是否有些意外?逐行解釋:
sizeof(iValue)輸出4很簡單,一個int占4個位元組,都會背了。
sizeof(array_int)輸出12,說明sizeof的參數如果是數組,則會輸出數組中所有元素的總位元組數。3個int元素,每個int4個位元組,一共12個位元組,很好了解。
後面的char和array_char也證明了這一點,一個char占一個位元組,array_char裡有3個元素,每個占1個位元組,這個數組中加起來就是3個位元組。
wchar_t是寬位元組,其對應的所有字元都是兩個占2個位元組。是以sizeof(array_wchar)就會輸出3*2=6。
sizeof(pEnglish)為何會輸出8呢?這是因為sizeof的參數若不是數組,隻是計算其對應變量的位元組數。這行代碼輸出的其實是pEnglish這個變量的位元組數,而不是它所指向的字元串。pEnglish是什麼?是個指針。在64位程式中,不管什麼類型的指針,都是占8個位元組;而在32位程式中,指針占4個位元組。
sizeof(pChinese)中pChinese所指向是一個中文字元串,但是pChinese本身也是一個char類型的指針,是以會輸出8。
sizeof(pInt),pInt也是一個指針,是以輸出的還是8(這裡沒有delete pInt,實際程式中一定不能忘了)。
總結起來兩點:
1、sizeof的參數如果是數組,則輸出數組中所有元素的位元組總數;
2、sizeof的參數如果不是數組,則輸出參數本身所占的位元組數。
根據上面所講第一點,很容易計算出數組中元素的個數:數組中所有元素的總位元組數/數組元素類型的位元組數。
例如上面的array_int,則隻需要:sizeof(array_int)/sizeof(int);array_wchar,則隻需要sizeof(array_wchar)/sizeof(wchar_t)即可。
另外,上面說到,在32位程式中,指針變量本身占4個位元組,以上程式,在vs的配置管理器中将程式改成x86的即可驗證。
運作結果如下:
可以看到,後面四個指針變量的sizeof都是4。
除了這些,我們還經常聽到“一個英文字元占1個位元組,一個中文字元占2個位元組”,又是什麼意思呢?在另一篇文章中會有介紹。