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