簡體   English   中英

關於C ++中sizeof運算符的功效

[英]about power of sizeof operator in C++

我正在閱讀現代C ++設計。 關於操作者的尺寸如下所述被提及。 以下段落從通用編程的角度進行了解釋。

sizeof具有驚人的功率:您可以將sizeof應用於任何表達式,無論多么復雜,sizeof返回其大小而不在運行時實際評估該表達式。 這意味着sizeof知道重載,模板實例化,轉換規則 - 可以參與C ++表達式的所有內容。 實際上,sizeof隱藏了一個完整的工具來推斷表達的類型; 最終,sizeof拋棄表達式並僅返回其結果的大小。

我的問題是作者的意思是sizeof返回它的大小而不是在運行時實際評估exression。 並且在最后一行中提到了sizeof拋棄了表達式。 請求幫助理解這些語句,如果用例子完成它會很好。

謝謝

sizeof編譯時 計算編譯器計算 sizeof運算符sizeof的表達式的sizeof 這是由編譯器一勞永逸地完成的,因此句子“沒有在運行時實際評估該表達式”

編譯器計算類型,然后它能夠從類型中推斷出表達式的大小,然后, 在編譯時 ,整個sizeof表達式將被計算出的大小替換。 因此表達式本身並沒有將它變成可執行代碼。 這就是句子“sizeof拋棄表達式並僅返回其結果的大小”的意思。

作者的意思是sizeof返回它的大小而不是在運行時實際評估exression。

這意味着sizeof(1/0)將產生sizeof(int) ,即使1/0通常會中止程序,因為除以零是運行時錯誤。 此外,對於聲明為T* p任何psizeof(*p)將產生sizeof(T)無論p存儲什么值,即使p是懸空還是根本沒有初始化。

下面給出了i++具有的類型的sizeof,它是int (通常int有4或8個字節,所以它可能會給你4或8的值)。 但是,由於未計算表達式,因此不對表達式執行運行時操作。

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

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

編譯器需要為各種操作計算類型/結構/類的大小。 sizeof運算符使這些大小可用作程序常量。 因此,例如,如果你執行sizeof(int) ,編譯器就會知道int大小(以字節為單位)並將插入該值。 這同樣適用於更復雜的事情,例如sizeof(myVariable)myVariable屬於MyClass類型:編譯器確實知道MyClass占用了多少空間,因此可以插入該值。

關鍵是這個評估在編譯時進行:結果是一個數字。 在運行時期間,不需要再次進行評估。

這意味着int j=sizeof(int); 將被編譯為int j=4;

我已閱讀已編譯的程序集,執行期間實際上沒有計算!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM