我写了一个简单的程序:
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 编译器无法优化给定代码的原因是什么?
constexpr函数不一定总是在编译时评估。但是,如果在constexpr上下文中使用,则必须在编译时进行评估,因此,无论编译器的优化如何:
都可以正常工作。int main()
{
constexpr auto len = strlen_c("hello world");
return len;
}
以下是上述代码生成的组件:
main:
mov eax, 11
ret
demo