符合标准的C++编译器是否允许在无符号整数上优化<= 0的分支?

Joh*_*ell 2 c++

考虑以下代码:

void foo(size_t value)
{
    if (value > 0) { ... }    // A

    if (value <= 0) { ... }   // B
}
Run Code Online (Sandbox Code Playgroud)

由于无符号不能为负,符合C++编译器的标准是否可以优化B语句?或者它只是选择比较0?

Rei*_*ica 8

好吧,它显然无法完全消除B语句 - 条件体在value0 时执行.

既然value不能,无论如何,< 0编译器当然可以将B转换成if (value == 0) { ... }.此外,如果它可以证明(记住标准要求严格的别名规则!)value没有被语句A改变,它可以合法地转换整个函数,如下所示:

void foo(size_t value)
{
    if (value > 0) { ... }    // A
    else { ... }   // B
}
Run Code Online (Sandbox Code Playgroud)

或者,如果它碰巧知道目标架构==更喜欢,请执行以下操作:

void foo(size_t value)
{
    if (value == 0) { ... }    // B
    else { ... }   // A
}
Run Code Online (Sandbox Code Playgroud)