最近遇到一個令我困惑的問題,就是 sizeof(string)的值,之前在vs2010上測得是固定28,最近在用CLion,上面測得是4,出現了不一樣的結果,我又在vs2013上試了一下,結果又不一樣,在vs2013上是32.
查閱了相關資料得出結論:string的實現在各庫中可能有所不同,但是在同一庫中相同一點是,無論你的string里放多長的字符串,它的sizeof()都是固定的,字符串所占的空間是從堆中動態分配的,與sizeof()無關。 sizeof(string)=4可能是最典型的實現之一,不過也有sizeof()為28、32字節的庫實現。 但是MS2015測試后sizeof(string)=40.還是跟編譯器有關.
也就是說sizeof(string)和字符串的長度是無關的,在一個系統中所有的sizeof(string)是一個固定值,這個和編譯器相關,string字符串是存儲在堆上,這個屬于動態分配的空間,對于別的整形浮點型數據類型則沒有這個問題。
sizeof到底是什么?
這個我們要看一下,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這個字眼,是不是想到了函數?錯了,sizeof不是一個函數,sizeof可以不加括號,所以sizeof不是函數。網上有人說sizeof是一元操作符,但是我并不這么認為,因為sizeof更像一個特殊的宏,它是在編譯階段求值的。舉個例子:
?
cout<<sizeof(int)<<endl; // 32位機上int長度為4cout<<sizeof(1==2)<<endl; // == 操作符返回bool類型,相當于 cout<<sizeof(bool)<<endl;
在編譯階段已經被翻譯為:
cout<<4<<endl;cout<<1<<endl;
這里有個陷阱,看下面的程序:
int a = 0;cout<<sizeof(a=3)<<endl;cout<<a<<endl;
輸出為什么是4,0, 而不是期望中的4,3???就在于sizeof在編譯階段處理的特性。由于sizeof不能被編譯成機器碼,所以sizeof作用范圍內,也就是()里面的內容也不能被編譯,而是被替換成類型。=操作符返回左操作數的類型,所以a=3相當于int,而代碼也被替換為:
int a = 0;cout<<4<<endl;cout<<a<<endl;
所以,sizeof是不可能支持鏈式表達式的,這也是和一元操作符不一樣的地方。
結論:不要把sizeof當成函數,也不要看作一元操作符,把他當成一個特殊的編譯預處理。
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?