std::string
constructionОбъект постоянной строки создается из постоянных данных, приводящих к неэффективному коду
Этот дефект повышен, когда оба из этих условий верны:
Вы создаете 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 \times. Каждый раз foo называется, s1S2 , и 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 \times. std::string_view объект s2 показывает содержимое s3 и старается не создавать std::string возразите каждый раз foo называется. При помощи std::string_view и static объекты, вы избегаете ненужной конструкции постоянного std::string объекты. Этот метод также разъясняет что объекты s3 и s3a представляйте те же данные.Повышения производительности могут варьироваться на основе компилятора, реализации библиотеки и среды, которую вы используете.
| Группа: Производительность |
| Язык: C++ |
| Значение по умолчанию: Off |
Синтаксис командной строки:
EXPENSIVE_CONSTANT_STD_STRING |
| Удар: Средняя |