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 |
| Удар: Средняя |