0

関数オブジェクトrandomElementByWeightコンストラクターは、ループの反復ごとに呼び出されますか、それともコンパイラーはこれを何らかの方法で最適化できますか?rand関数が反復ごとに呼び出されることを確認したいので、関数オブジェクトコンストラクターにそれを含める方が良いと思います。

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());
}
4

2 に答える 2

2

はい、そうです。コンストラクターは常に一時変数に対して呼び出されます。コンパイラーが、省略された場合に副作用がないことを完全に確信していない限り、それを最適化することはできません。

于 2011-07-14T18:06:32.873 に答える
0

補足として、次のコード:

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

return false;

次のように省略できます。

return (randomNumber -= e.weight) <= 0.0;
于 2011-07-14T18:34:59.140 に答える