std::string::c_str()
use in a
std::string
operationСтроковая операция использует выход std::string::c_str
метод, приводящий к неэффективному коду
Этот дефект происходит, когда строковая операция выполняется при помощи указателя струны до, полученного из std::string::c_str
. Например, это средство проверки повышено когда:
Новый std::string
или std::wstring
неявно или явным образом создается из выхода соответствующего c_str
. Эта ситуация возникает когда функция, ожидая const
ссылка на строку сталкивается с const char*
вместо этого.
Новая копия объекта строки создается явным образом из выхода своего c_str
функция. Используя копию конструктор является более эффективным способом скопировать объект строки.
Определенный std::string
функции членства вызываются при помощи выхода std::string::c_str
. Отмеченные функции включают replace
добавление
, assign
Сравнение
, и find
. Используя std::string
возразите непосредственно, чтобы вызвать std::string
функции членства более эффективны.
Пользовательская функция, которая перегружается, чтобы принять любой из const char*
и const std::string
аргументы вызываются при помощи указателя струны до. Более эффективно вызвать std::string
перегрузка такой функции.
Это дорого и неэффективно, чтобы использовать струну до выход std::string::c_ctr
метод, когда можно использовать std::string
объект вместо этого. std::string
объект содержит длину строки. Когда вы используете струну до выход std::string::c_str
метод вместо std::string
объект, конструктор определяет длину струны до линейным поиском, приводящим к неэффективному коду. Используя 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
требует струны до как входа, с помощью 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 |
Удар: Средняя |