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