for循环中的临时函数对象

发布于 2024-11-19 20:52:43 字数 584 浏览 4 评论 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());
}

Does the function object randomElementByWeight constructor get called for every iteration through the loop or can the compiler optimize this away somehow? I want to make sure the rand function is called for each iteration and I think it's nicer to have it in the function object constructor.

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

慢慢从新开始 2024-11-26 20:52:44

顺便说明一下,以下代码:

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

return false;

可以缩写为:

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

Just a side note, the following code:

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

return false;

can be abbreviated to:

return (randomNumber -= e.weight) <= 0.0;
表情可笑 2024-11-26 20:52:43

是的,总是为临时变量调用构造函数。除非编译器完全确定省略不会产生副作用,否则它不会优化它。

Yes it does, a constructor is always called for a temporary variable. Unless the compiler knows absolutely sure there are no side-effects if ommitted it won't optimize it away.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文