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