std::string::c_str()
use in a
std::string
operationОперация строки использует выход std::string::c_str
метод, приводящий к неэффективному коду
Этот дефект возникает, когда строковая операция выполняется с помощью указателя на C-строку, полученного из std::string::c_str
. Для образца эта проверка возникает, когда:
Новый std::string
или std::wstring
неявно или явно сконструирован из выхода соответствующего c_str
. Эта ситуация возникает, когда функция, ожидающая const
ссылка на строку сталкивается с const char*
вместо этого.
Новая копия строкового объекта создается явно из выхода его c_str
функция. Использование конструктора копирования является более эффективным способом копирования строкового объекта.
Определенные std::string
Представители функции вызываются с помощью выхода std::string::c_str
. Помеченные функции включают replace
, append
, assign
, compare
, и find
. Использование std::string
объект непосредственно для вызова std::string
функции представителей более эффективны.
Определяемая пользователем функция, которая перегружена для принятия любого из const char*
и const std::string
аргументы вызываются с помощью указателя на C-строку. Эффективнее вызвать std::string
перегрузка такой функции.
Использовать выход C-string std::string::c_ctr
дорого и неэффективно метод, когда вы можете использовать
std::string
вместо этого объект. Система координат std::string
объект содержит длину строки. Когда вы используете C-строковый выход std::string::c_str
метод вместо std::string
объект, конструктор определяет длину C-строки линейным поиском, что приводит к неэффективному коду. Использование std::string::c_str
также часто излишне. Рассмотрим этот код:
void set_prop1(const char* str); void set_prop2(const std::string& str); void foo( std::string& str){ //... set_prop1(str.c_str()); // Necessary //... set_prop2(str.c_str()); // Inefficient }
foo
вызывает две различные функции. Потому что функция set_prop1
требуется C-строка в качестве входов, с использованием str.c_str
функция необходима, чтобы сформировать вход для set_prop1
. Функция set_prop2
принимает std::string
как вход. Вместо непосредственного использования str
как вход в set_prop2
, str.c_str
используется, возможно, как ошибка копирования-вставки. Компилятор неявно создает новое std::string
объект, который идентичен str
, при помощи выхода str.c_str
. Построение нового std::string
объект в этом случае ненужен и неэффективен. Поскольку этот код компилируется и функционирует правильно, этот неэффективный код может быть не замечен.Чтобы исправить этот дефект, замените вызовы на std::string::c_str
по std::string
. Рассмотрим этот код:
void set_prop1(const char* str); void set_prop2(const std::string& str); void foo( std::string& input){ //... set_prop1(str.c_str()); // Necessary //... set_prop2(str); // Efficient }
str
вместо str.c_str
как вход в set_prop2
делает код более эффективным и исправляет дефект.Эффективность улучшения могут варьироваться в зависимости от используемого компилятора, реализации библиотеки и окружения.
Группа: Эффективность |
Язык: C++ |
По умолчанию: Off |
Синтаксис командной строки
: EXPENSIVE_C_STR_STD_STRING_OPERATION |
Влияние: Средний |