为什么编译器无法优化出这个std :: string构造?

时间:2018-06-04 17:57:03

标签: c++ g++ compiler-optimization clang++ stdstring

请考虑以下代码:

#include <string>
#include <cstring>

size_t foo(const char* cptr)
{
    if (cptr == nullptr) { return 0; }
    return strlen(cptr);
}

size_t bar()
{
    static const char* cptr { "Hello world" };
    return std::string{cptr}.length();
}

size_t baz(const char* cptr)
{
    if (cptr == nullptr) { return 0; }
    return std::string{cptr}.length();
}

使用GodBolt,我们can see GCC 8.1和Clang ++ 6.0可以优化std::string中的bar(),而不是baz()中的baz()。在foo()中,虽然编译器不能返回固定值,但它绝对可以运行代码来检查字符串长度,而不构造任何东西,或者至少没有完成构造 - 即行为与{{1}类似}。为什么要完全构造字符串?

1 个答案:

答案 0 :(得分:2)

<Resources> <Endpoints> <Endpoint Protocol="http" Name="ServiceEndpoint" Type="Input" Port="8315" /> </Endpoints> </Resources> 中,编译器不知道baz指向的是什么,因此必须构造一个字符串以获得它的大小。

cptr中,编译器知道bar指向cptr的内容,因此它可以用字符串的大小替换字符串创建和对"Hello world"的调用。