簡體   English   中英

sizeof(long)與sizeof(* lp)

[英]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.

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