constexpr keywork不会影响代码生成

时间:2017-02-22 11:33:27

标签: c++11 g++ compiler-optimization

我写了一个简单的程序:

constexpr int strlen_c(char const* s)
{
    return *s ? 1 + strlen_c(s + 1) : 0;
}

int main()
{
    return strlen_c("hello world");
}

我希望编译器优化函数并在编译时评估其结果。但实际上生成的机器代码在循环中评估结果:

    mov     edx, offset aHelloWorld ; "hello world"
loc_408D00:
    add     edx, 1
    mov     eax, edx
    sub     eax, offset aHelloWorld ; "hello world"
    cmp     byte ptr [edx], 0
    jnz     short loc_408D00
    leave
    retn

该程序正在使用带有标志-std=c++11 -Ofast -O2的g ++版本5.3进行编译。我在Visual Studio 2013和g ++ 4.9中获得的结果相同。

Quaestion 编译器无法优化给定代码的原因是什么?

1 个答案:

答案 0 :(得分:3)

constexpr函数不一定总是在编译时评估。但是,如果在constexpr上下文中使用它,则必须在编译时对其进行评估。因此,无论编译器优化如何,以下都将起作用:

int main()
{
   constexpr auto len = strlen_c("hello world");
   return len;
}

以下是为上述代码生成的程序集:

main:
        mov     eax, 11
        ret

Demo