2011-02-26 72 views
4

我正在閱讀Modern C++設計。關於作業人員的大小,如下所述被記載。以下段落從泛型編程的角度進行了解釋。關於C++中sizeof運算符的功能

sizeof有一個驚人的功能:無論多麼複雜,您都可以將sizeof應用於任何表達式,並且sizeof返回其大小,而無需在運行時實際評估該表達式。這意味着sizeof意識到重載,模板實例化,轉換規則 - 所有可以參與C++表達式的東西。實際上,sizeof隱藏了推導表達式類型的完整工具;最終,sizeof拋出表達式並僅返回其結果的大小。

我的問題是作者是什麼意思sizeof返回其大小與實際評估在運行時的展望。並且在最後一行中提到sizeof拋出表達式。請求幫助理解這些陳述,如果它是用示例完成的話,那將是很好的。

由於

+0

想想表達式中的「i ++」或函數/方法調用; 'sizeof'顯然不會執行那些跟蹤類型的報告結果的大小。我從來不知道C++'sizeof'太強大了:)謝謝! – sarnold 2011-02-26 11:08:15

+0

這篇文章可能會幫助你http://stackoverflow.com/questions/671790/how-does-sizeofarray-work – 2011-02-26 11:12:33

+0

我想這就是爲什麼'decltype'是第一個C++ 0x可用,因爲機制已經可用無論如何:) – 2011-02-26 12:45:43

回答

2

作者指的是什麼意思sizeof返回它的大小與實際評估在運行時的展望。

這意味着sizeof(1/0)將產生sizeof(int),即使1/0通常會中止該程序,因爲被零除是運行時錯誤。此外,對於任何p聲明爲T* p,sizeof(*p)將產生sizeof(T)無論存儲在p什麼值,即使p懸而未決或根本沒有初始化。

1

以下給出您i++具有類型,這是int的的sizeof(通常一個int具有4或8個字節,所以它可能會給你值4或8)。但是,由於不評估表達式,因此不會對錶達式執行任何運行時操作。

int i = 0; 
sizeof(i++); 

評估表達式基本上意味着在運行時執行其副作用(例如遞增變量)或讀取內存或寄存器中的值。因此,從某種意義上說,sizeof「拋棄」它的操作數,因爲它沒有真正執行它指定的運行時操作(i的值仍然爲零)。

0

編譯器需要計算各種操作的類型/結構體/類的大小。 sizeof運算符將這些大小作爲常量提供給程序。舉例來說,如果你做sizeof(int)編譯器知道int是多大(以字節爲單位),並且會插入該值。這同樣適用於更復雜的東西,如sizeof(myVariable)myVariable的類型爲MyClass:編譯器確實知道MyClass佔用了多少空間,因此可以插入該值。

問題是,此評估發生在編譯時:結果是一個數字。在運行期間,評估不需要再次完成。

2

sizeof在編譯時被評估:在編譯器計算下面的操作者sizeof的表達式的類型。這是由編譯器完成一勞永逸,因此句子「沒有在運行時實際上對錶達式」

編譯器計算類型,則它能夠從類型推導出表達式的大小,然後,仍然在編譯時,整個sizeof表達由所計算出的大小替換。所以表達式本身並沒有將它變成可執行代碼。這就是句子「的sizeof扔掉的表達,並只返回其結果的大小」手段。

0

這意味着int j=sizeof(int);會被編譯爲int j=4;

我看過編譯的程序集,在執行過程中沒有實際計算的!

+1

這是錯誤的,至少部分。 'sizeof(int)'不總是4,它是平臺相關的;此外,不應將結果分配給「int」,而應分配給「size_t」變量。 – 2011-04-30 09:48:56