[英]sizeof (long) vs sizeof (*lp)
經常執行的一段代碼具有以下計算:
long *lp
char *ep, *cp
...
tlen = (ep - cp) / sizeof (*lp);
將此更改為:
long *lp
char *ep, *cp
...
tlen = (ep - cp) / sizeof (long);
導致任何更高的效率(因為在編譯時計算出sizeof的大小),或者現代編譯器已經在編譯時處理了這一點。 gcc是做什么的?
sizeof
運算符始終是編譯時評估的構造0 ,因此沒有區別。
片段...
tlen = (ep - cp) / sizeof (*lp);
因此將被轉化成與眾不同的東西...
tlen = (ep - cp) / 4;
(假設sizeof(long)==4
1。 ),應用優化后,下一個轉換可能是...
tlen = (ep - cp) >> 2;
當然,還會有更多優化。 這只是一個可能的結果的證明,它可能是編譯時構造0 。
我總是喜歡"sizeof(_var-name_)"
不是sizeof(_typename_)
,因為它更通用,並且在更改變量類型時不需要手動調整(從數組更改為指針時除外)。
0:可變長度數組除外。
1:尺寸因平台而異
sizeof()
始終在編譯時計算,因此沒有區別。
您可以通過以下方式完全放棄該部門
tlen = ((long*)ep - (long*)cp);
我不確定這樣做是否會更有效。 我的小實驗尚無定論。 測試!
編輯:並且如注釋中所述,它僅在指針實際指向long(或指向適合容納long的內存位置)時才有效。 但是,如果它們不在原始代碼中,那么原始結果也將毫無意義,所以我認為它們是正確的。
根據平台的不同,不會導致性能差異,但會導致行為差異。 例如:在Win x64上,sizeof(long)為4,但sizeof(* lp)為8
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.