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 |
| Удар: носитель |