[英]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
任何p
, sizeof(*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.