2009-08-12 1223 views
8

將迭代器條件右操作數從size_t轉換爲int或迭代可能超過最大值int是否更好?答案實施是否具體?從size_t轉換爲int,或者使用size_t迭代?

int a; 
for (size_t i = 0; i < vect.size(); i++) 
{ 
    if (some_func((int)i)) 
    { 
     a = (int)i; 
    } 
} 

int a; 
for (int i = 0; i < (int)vect.size(); i++) 
{ 
    if (some_func(i)) 
    { 
     a = i; 
    } 
} 
+1

我認爲你的意思是size_t無論你的問題說type_t?如果是這樣,請編輯它。 – 2009-08-12 18:41:17

+2

使用'static_cast'。 – GManNickG 2009-08-12 18:42:08

+4

請注意,即使在32位系統上,size_t和int也不是同一類型。當int被簽名時'size_t'是無符號的。這可能是一個重要的項目。 – 2009-08-12 18:51:22

回答

7

我幾乎總是使用第一個變化,因爲我發現的時候80%左右,我發現some_func或許也會採取一個size_t。

如果實際上some_func需要帶符號整數,您需要知道當vect大於INT_MAX時會發生什麼情況。如果解決方案在您的情況下並不明顯(通常不是),那麼您至少可以用some_func(numeric_cast<int>(i))代替some_func((int)i)(有關numeric_cast的一個實現,請參閱Boost.org)。當vect增長超過你的計劃時,這有一個優點,就是拋出一個異常,而不是默默地包裝到負值。

+0

我喜歡在這種情況下引發異常的想法,因爲它消除了任何真正奇怪的行爲......然後再次,這將是一個巨大的麻煩,考慮它可能永遠不會超過'INT_MAX'。 – 2009-08-12 19:50:10

+0

@Nick:你爲什麼認爲添加一個包含和使用不同的演員(和一個適當的演員,FTM - C風格演員從來都不是適當的)是太麻煩了。 – sbi 2009-08-13 12:08:12

+0

函數應該「做你想做的事」。一種函數「做你想做的事情,直到一些無證的限制被超越,然後做別的事情」,這就是通常所說的「地雷」。在你的代碼中留下地雷對於除了家庭作業問題之外的任何事情來說都是一個壞主意。 – 2009-08-13 20:05:19

3

我只是把它作爲一個size_t,因爲有沒有一個很好的理由不這樣做。你的意思是「或迭代可能達到type_t的最大值」?您只能迭代到vect.size()的值。

1

對於大多數編譯器來說,它沒有任何區別。在32位系統上,很明顯,即使在64位系統上,這兩個變量都可能存儲在64位寄存器中,並作爲64位值壓入堆棧。

如果編譯器將int值存儲爲堆棧上的32位值,則第一個函數在CPU週期方面應該更高效。

但不同的是可以忽略不計(雖然第二功能「看上去」清潔劑)

+0

謝謝,是的,我認爲第二個看起來更清潔,因爲鑄件少了。同意? – 2009-08-12 18:52:31