std::string строительствоОбъект постоянной строки создается из постоянных данных, что приводит к неэффективному коду
Этот дефект возникает, когда оба этих условия верны:
Вы создаете std::string объект из постоянных данных, таких как строковый литерал или выходные данные constexpr функция.
std::string после построения объект остается постоянным или неизмененным.
Эта проверка не помечает переменные-члены класса и строковые литералы, которые являются аргументами функции.
Рассмотрим std::string объекты в кодовом блоке, содержащем постоянные данные, которые остаются неизмененными после построения. Каждый раз при выполнении блока кода создается новый std::string объект конструируется без изменения его содержимого. Повторное построение такого std::string объект без модификации контента неэффективен и его трудно обнаружить. Рассмотрим этот код:
#include <string>
constexpr char* getStrPtr() {
return "abcd";
}
void foo(){
std::string s1 = "abcd";
std::string s2{"abcd"};
std::string s3 = getStrPtr();
}
int main(){
//...
for(int i = 0; i<10000; ++i)
foo();
}foo называется 10000 времена. Каждый раз foo называется, s1, s2, и s3 создаются из одного и того же строкового литерала константы abcd, что приводит к неэффективному коду. Поскольку такой неэффективный и запутанный код правильно компилирует и функционирует, неэффективное построение std::string объекты из постоянных данных могут быть не замечены.Исправление этого дефекта зависит от предполагаемого использования постоянных данных.
Постоянные данные можно сохранить в static строковый объект, если необходимы функциональные возможности std::string класс.
Постоянные данные можно использовать непосредственно в качестве временных литералов, если не требуется повторно использовать данные.
Постоянные данные можно сохранить с помощью const символьный массив или std::string_view если вам не нужны функциональные возможности std::string класс. std::string_view поддерживается C++ 17 и более поздними версиями.
Рассмотрим этот код:
constexpr char* getStrPtr() {
return "abcd";
}
void foo(){
static std::string s3 = getStrPtr();
std::string_view s3a{s3};
}
int main(){
//...
for(int i = 0; i<10000; ++i)
foo();
}std::string объект s3 объявлен как static. Поскольку s3 является static, он конструируется только один раз, даже если foo называется 10000 времена. std::string_view объект s2 показывает содержимое s3 и избегает построения std::string объект каждый раз foo вызывается. С помощью std::string_view и static объекты, вы избегаете ненужного построения константы std::string объекты. Этот метод также поясняет, что объекты s3 и s3a представляют одни и те же данные.Повышение производительности может зависеть от используемого компилятора, реализации библиотеки и среды.
| Группа: Производительность |
| Язык: C++ |
| По умолчанию: Откл. |
Синтаксис командной строки:
EXPENSIVE_CONSTANT_STD_STRING |
| Воздействие: среднее |