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 |
Влияние: Средний |