2011-07-14 31 views
0

函數對象randomElementByWeight構造函數是否在循環中每次迭代都被調用,或者編譯器是否可以優化它?我想確保每次迭代都調用rand函數,並且我認爲將它放在函數對象構造函數中會更好。for循環中的臨時函數對象

struct randomElementByWeight 
{ 
    double randomNumber; 

    randomElementByWeight() : randomNumber(rand()/static_cast<double>(RAND_MAX)) {} 

    bool operator()(const Element& e) 
    { 
     if ((randomNumber -= e.weight) <= 0.0) 
     { 
      return true; 
     } 

     return false; 
    } 
}; 

... 

for (int i = 0; i < 3; ++i) 
{ 
    iter = find_if(routes.begin(), routes.end(), randomElementByWeight()); 
} 

回答

2

是的,它總是爲臨時變量調用構造函數。除非編譯器知道如果省略,則沒有任何副作用,否則不會優化它。

0

只是一個側面說明,下面的代碼:

if ((randomNumber -= e.weight) <= 0.0) 
{ 
    return true; 
} 

return false; 

可以縮寫爲:

return (randomNumber -= e.weight) <= 0.0; 
+0

我得到一個警告,當我做到這一點警告MS VS2008 C4800: '雙師型':強制值bool'true'或'false'(性能警告) – ephi

+0

@ephi:不可能,'<='運算符產生一個bool。你忘記了括號還是什麼? – fredoverflow

+0

是。我一定錯過了什麼。我再次嘗試,並確定 – ephi