请考虑以下代码:
#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}类似}。为什么要完全构造字符串?
答案 0 :(得分:2)
在<Resources>
<Endpoints>
<Endpoint Protocol="http" Name="ServiceEndpoint" Type="Input" Port="8315" />
</Endpoints>
</Resources>
中,编译器不知道baz
指向的是什么,因此必须构造一个字符串以获得它的大小。
在cptr
中,编译器知道bar
指向cptr
的内容,因此它可以用字符串的大小替换字符串创建和对"Hello world"
的调用。