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