我有一个像下面这样的循环,它有一个不变量,这里是 scaleEveryValueByTwo 的永不改变的值。 我可以依靠编译器找到这个不变量而不检查每次迭代中的条件 (基本上编译成与底部代码类似的东西)?

void loadValuesFromDisk(const bool scaleEveryValueByTwo)
{
    std::vector<MyValueType> xs;
    while(fileHasNewValues())
    {
        auto x = loadNextValue();
        if (scaleEveryValueByTwo)
        {
            x *= 2;
        }
        xs.push_back(x);
    }
}

我当然可以手动将其拆分为两个循环(见下文)或将缩放部分放在一个单独的函数中,但在许多情况下,这会使代码更长,而且在我看来更难阅读(例如,如果我有嵌套循环3D 数据的所有维度我将复制所有三行循环标题和最多六行花括号)。
void loadValuesFromDisk(const bool scaleEveryValueByTwo)
{
    std::vector<MyValueType> xs;
    while(fileHasNewValues())
    {
        auto x = loadNextValue();
        xs.push_back(x);
    }

    if (scaleEveryValueByTwo)
    {
        for(auto &x : xs)
        {
            x *= 2;
        }
    }
}

我主要感兴趣的是我是否可以依赖于这个(或者甚至更好地强制执行)这种对常用编译器(如 gcc 或 MSVC)的优化,而不是一些可能缺少大多数编译器事实上的标准优化的奇特优化。

最佳答案

之前 MSVC 编译器中曾经有/Og(全局优化),现在默认启用。
我的猜测是其他编译器也这样做。

要了解循环优化是如何完成的,请查看以下链接并搜索“循环优化”

https://docs.microsoft.com/en-us/cpp/build/reference/og-global-optimizations?view=vs-2019

由于这是默认设置,因此您可以依赖编译器。

10-07 12:46
查看更多