std::string::c_str() использование в std::string операцияСтроковая операция использует выходные данные std::string::c_str способ, приводящий к неэффективному коду
Этот дефект возникает, когда строковая операция выполняется с помощью указателя C-string, полученного из std::string::c_str. Например, эта проверка поднимается, когда:
Новое std::string или std::wstring неявно или явно создается из выходных данных соответствующего c_str. Эта ситуация возникает, когда функция ожидает const ссылка на строку встречает const char* вместо этого.
Новая копия строкового объекта создается явным образом из выходных данных его c_str функция. Использование конструктора копирования является более эффективным способом копирования строкового объекта.
Бесспорный std::string функции-члены вызываются с помощью вывода std::string::c_str. Отмеченные функции включают replace, append, assign, compare, и find. Использование std::string объект непосредственно для вызова std::string функции-члены более эффективны.
Пользовательская функция, перегруженная для принятия любой из const char* и const std::string вызывается с помощью указателя C-строки. Более эффективно вызывать std::string перегрузка такой функции.
Использование C-строкового выхода std::string::c_ctr метод, когда можно использовать std::string вместо этого объект. Один std::string содержит длину строки. При использовании вывода C-строки std::string::c_str вместо метода std::string объект, конструктор определяет длину C-строки линейным поиском, что приводит к неэффективному коду. Используя 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 требует C-строку в качестве входных данных, используя 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++ |
| По умолчанию: Откл. |
Синтаксис командной строки:
EXPENSIVE_C_STR_STD_STRING_OPERATION |
| Воздействие: среднее |