Почему компиляторы не могут оптимизировать эту конструкцию std :: string? - PullRequest
0 голосов
/ 04 июня 2018

Рассмотрим следующий код:

#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().Почему он полностью создает строку?

1 Ответ

0 голосов
/ 04 июня 2018

В baz компилятор не знает, на что указывает cptr, поэтому он должен создать строку, чтобы получить ее размер.

В bar компилятор знает, на что cptr указывает "Hello world", поэтому он может заменить создание строки и вызов size размером строки.

...