首页 > 解决方案 > 为什么编译器不能优化这个 std::string 构造?

问题描述

考虑以下代码:

#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,我们可以看到GCC 8.1 和 Clang++ 6.0 可以优化std::stringin 两者bar(),但不能优化baz(). 在baz()中,虽然编译器不能返回固定值,但它绝对可以只运行检查字符串长度的代码,而不构造任何东西,或者至少不完成构造 - 即行为类似于foo(). 为什么它完全构造字符串?

标签: c++g++compiler-optimizationclang++stdstring

解决方案


baz编译器中不知道cptr指向什么,所以它必须构造一个字符串来获取它的大小。

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


推荐阅读