C++ 使用 `const int` 作为循环变量?

标签 c++ conditional-compilation

我想根据以下两种情况编写有条件编译的代码:

案例A:

    for(int i = 1; i <= 10; ++i){
        // do something...
    }

CASE_B:(==!CASE_A)

    {
        const int i = 0;
        // do something...
    }

也就是说,在情况 A 中,我希望对变量 i 进行正常循环,但在情况 B 中,我想将局部范围变量 i 限制为仅一种特殊情况(此处指定为 i = 0)。显然,我可以按照以下方式写一些东西:

    for(int i = (CASE_A ? 1 : 0); i <= (CASE_A ? 10 : 0); ++i){
         // do something
    }

但是,我不喜欢这种设计,因为它不允许我在特殊情况 B 中利用 const 声明。这样的声明可能会像正文一样允许进行大量优化此循环的大部分受益于 i 的潜在编译时替换为其常量值。

期待社区提供有关如何有效实现这一目标的任何提示。

谢谢!

编辑:

CASE_A 与 CASE_B 可以在编译时求值。

i 没有作为引用传递

i 没有在主体中重新计算(否则 const 没有意义),但我不确定编译器是否会努力证明这一点

最佳答案

假设您没有过度简化您的示例,这应该无关紧要。假设 CASE_A 可以在编译时求值,代码:

for( int i = 0; i <= 0; ++i ) {
    do_something_with( i );
}

将生成与以下相同的机器码:

const int i = 0;
do_something_with( i );

对于任何体面的编译器(当然,优化打开)。

在研究这个过程中,我发现这里有一个很好的点。如果 i 通过指针或引用传递给函数,编译器不能假定它没有改变。即使指针或引用是 const 也是如此! (因为 const 可以在函数中丢弃。)

关于C++ 使用 `const int` 作为循环变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5973159/

相关文章:

rust - 如何正确弃用一个 crate 特性

c++ - 参数包构造函数优于其他构造函数调用

c++ - 将 Qlistview 限制为最多 1 个选定项目

c++ - 以编程方式在 vector 相等性中查找标量

c# - Visual Studio C# 项目 : how to place conditional references in . csproj?

rust - Rust 中具有条件编译的相同函数的不同版本

c - '#' 字符是否必须位于 C 预处理器中一行的开头?

c++ - 是否发布了新版本的 C++ 标准?

c++ - 将数据从 vector<unsigned char> 传输到 unsigned char[]

python - Python中的条件编译