C++11 constexpr键工作不';不影响代码生成

C++11 constexpr键工作不';不影响代码生成,c++11,g++,compiler-optimization,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_408

我写了一个简单的程序:

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
该程序是用g++版本5.3编译的,带有标志
-std=c++11-Ofast-O2
。与我在Visual Studio 2013和g++4.9中获得的结果相同


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

不一定总是在编译时计算constexpr函数。但是,如果在constexpr上下文中使用,则必须在编译时对其进行计算,因此,无论编译器进行了哪些优化,以下内容都将起作用:

int main()
{
   constexpr auto len = strlen_c("hello world");
   return len;
}
以下是为上述代码生成的程序集:

main:
        mov     eax, 11
        ret

g++和clang++都优化了代码。这取决于编译器的实现。@VittorioRomeo您能说g++的版本和必要的编译标志吗?GCC 6、ICC 16和Clang 3.1都只是加载值11并返回。这些可以在交互式反汇编网站上找到。还有微软C++ 19.10(我不知道哪个Visual Studio),它甚至无法优化Dinesh的答案。在运行时,微软的编译器<代码> StruLyc<代码>。然后它丢弃结果并返回常量11。该标准不提供性能保证…