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
называется, s1
S2
, и 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 |
Удар: носитель |