Рассмотрим следующий код:
#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::string
в обоих bar()
, ноне в baz()
.В baz()
, хотя компилятор не может вернуть фиксированное значение, он может определенно просто запустить код для проверки длины строки, не создавая ничего, или, по крайней мере, не завершив конструирование - то есть ведет себя подобно foo()
.Почему он полностью создает строку?