2012-04-25 82 views
1

一個非常經常執行的代碼具有以下計算:的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做什麼?

+3

'sizeof'總是(除了變長數組,其他方式有問題)編譯時間常量。如果給它一個表達式,它會在編譯時計算表達式類型的大小。 – geekosaur 2012-04-25 05:32:54

回答

9

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); 

我不知道,如果執行這個效率會比較高,雖然與平臺

2

sizeof()總是在編譯時計算,所以沒有區別。

+1

並非總是如此,自C99以來,一直在運行時大小不等的VLA。 – 2012-04-25 05:34:40

0

您可以用師免除不同。我的小實驗沒有結果。測試!

編輯:正如在評論中提到的,它只有在指針實際指向多頭(或適合持有多頭的內存位置)時才起作用。但是如果他們沒有在原來的代碼中,原來的結果也沒有意義,所以我推測他們是。

+1

如果'ep'和'cp'沒有合適的對齊類型'long',則強制轉換調用未定義的行爲。 – 2012-04-25 05:54:42

+0

@R ..你是對的,我沒有想過這件事。但是,如果指針未對齊,OP的原始公式也會受到嚴重影響。 – 2012-04-25 06:12:54

+0

@MrLister不,它不是。就C語言而言,代碼很可能沒有意義,但結果是明確的。 – Lundin 2012-04-25 06:22:31

0

不會導致性能差異,但會導致取決於平臺的行爲差異。例如:Win x64 sizeof(long)將是4,但sizeof(* lp)是8