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