2 回答

TA貢獻1871條經(jīng)驗 獲得超8個贊
string 是一個類 不是數(shù)據(jù)類型
string的實現(xiàn)在各庫中可能有所不同,但是在同一庫中相同一點是,無論你的string里放多長的字符串,它的sizeof()都是固定的,字符串所占的空間是從堆中動態(tài)分配的,與sizeof()無關(guān)。
有sizeof()為12、32字節(jié)的庫實現(xiàn)。 但是VC6.0測試后sizeof(string)=16.還是跟編譯器有關(guān)。
首先看一下sizeof在msdn上的定義:
The sizeof keyword gives the amount of storage, in bytes, associated with a variable or a type (including aggregate types). This keyword returns a value of type size_t.
看到return這個字眼,是不是想到了函數(shù)?錯了,sizeof不是一個函數(shù),你見過給一個函數(shù)傳參數(shù),而不加括號的嗎?sizeof可以,所以sizeof不是函數(shù)。網(wǎng)上有人說sizeof是一元操作符,但是我并不這么認為,因為sizeof更像一個特殊的宏,它是在編譯階段求值的。舉個例子:
cout<<sizeof(int)<<endl; // 32位機上int長度為4
cout<<sizeof(1==2)<<endl; // == 操作符返回bool類型,相當(dāng)于 cout<<sizeof(bool)<<endl;
在編譯階段已經(jīng)被翻譯為:
cout<<4<<endl;
cout<<1<<endl;
這里有個陷阱,看下面的程序:
int a = 0;
cout<<sizeof(a=3)<<endl;
cout<<a<<endl;
輸出為什么是4,0而不是期望中的4,3???就在于sizeof在編譯階段處理的特性。由于sizeof不能被編譯成機器碼,所以sizeof作用范圍內(nèi),也就是()里面的內(nèi)容也不能被編譯,而是被替換成類型。=操作符返回左操作數(shù)的類型,所以a=3相當(dāng)于int,而代碼也被替換為:
int a = 0;
cout<<4<<endl;
cout<<a<<endl;
所以,sizeof是不可能支持鏈?zhǔn)奖磉_式的,這也是和一元操作符不一樣的地方。
結(jié)論:不要把sizeof當(dāng)成函數(shù),也不要看作一元操作符,把他當(dāng)成一個特殊的編譯預(yù)處理。
- 2 回答
- 0 關(guān)注
- 197 瀏覽
添加回答
舉報