一個非常經常執行的代碼具有以下計算:的sizeof(長)比的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(長)比的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
運算符總是一個編譯時評估構造,所以沒有區別。
的片段...
tlen = (ep - cp)/sizeof (*lp);
將因此被轉化爲不不同於東西...
tlen = (ep - cp)/4;
(假設sizeof(long)==4
。)中,用優化施加下一變換大概是...
tlen = (ep - cp) >> 2;
當然會有更多的優化。這僅僅是編譯時構造的可能後果的證明。
我總是更喜歡"sizeof(_var-name_)"
而不是sizeof(_typename_)
,因爲它更通用,並且當您更改變量的類型(除非從數組更改爲指針)時不需要手動調整。
0:除可變長度數組外。
1:大小完全通過寫
tlen = ((long*)ep - (long*)cp);
我不知道,如果執行這個效率會比較高,雖然與平臺
sizeof()
總是在編譯時計算,所以沒有區別。
並非總是如此,自C99以來,一直在運行時大小不等的VLA。 – 2012-04-25 05:34:40
您可以用師免除不同。我的小實驗沒有結果。測試!
編輯:正如在評論中提到的,它只有在指針實際指向多頭(或適合持有多頭的內存位置)時才起作用。但是如果他們沒有在原來的代碼中,原來的結果也沒有意義,所以我推測他們是。
如果'ep'和'cp'沒有合適的對齊類型'long',則強制轉換調用未定義的行爲。 – 2012-04-25 05:54:42
@R ..你是對的,我沒有想過這件事。但是,如果指針未對齊,OP的原始公式也會受到嚴重影響。 – 2012-04-25 06:12:54
@MrLister不,它不是。就C語言而言,代碼很可能沒有意義,但結果是明確的。 – Lundin 2012-04-25 06:22:31
不會導致性能差異,但會導致取決於平臺的行爲差異。例如:Win x64 sizeof(long)將是4,但sizeof(* lp)是8
'sizeof'總是(除了變長數組,其他方式有問題)編譯時間常量。如果給它一個表達式,它會在編譯時計算表達式類型的大小。 – geekosaur 2012-04-25 05:32:54