c++ - 我可以依靠编译器查找和优化简单的 bool 循环不变量吗?

标签 c++ compiler-optimization

我有一个类似于下面的循环,它有一个不变量,这里是 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://learn.microsoft.com/en-us/cpp/build/reference/og-global-optimizations?view=vs-2019

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

关于c++ - 我可以依靠编译器查找和优化简单的 bool 循环不变量吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55696750/

相关文章:

c++ - 我正在尝试运行使用 Boost 库的 C++ 代码

c - GCC 5.1 循环展开

go - 'go run -gcflags -m xxx.go' 的输出是什么意思

java - Windows C++ 相当于 Java 的 LockSupport.parkNanos()

c++ - 如何分析 Linux 可执行文件的静态内存使用情况?

C++ - 更改成员值时调用函数

c# - 编译器优化在循环期间保持静态的属性

c - 执行错误: Part of C code compiled but not being executed properly in ECM

c++ - GCC 编译器优化对性能的不利影响的解释?

c++ - 如何使用类似 boost.parameter 的语法获得更快的编译速度?