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