exponenta event banner

Неэффективное вычисление длины строки

Длина строки, вычисляемая с помощью функций длины строки при возврате из std::basic_string::c_str() вместо использования std::basic_string::length()

Описание

Этот дефект возникает, когда длина std::basic_string строка вычисляется с помощью функций длины строки на указателе, возвращенном из std::basic_string::c_str() вместо использования метода std::basic_string::length().

Средство проверки помечает функции длины строки, такие как strlen, wcslen и char_traits::length.

Риск

std::basic_string::c_str() возвращает указатель на массив символов со значением NULL, в котором хранятся те же данные, что и в строке. Использование функции длины строки, например strlen ожидается, что в этом массиве символов будет возвращена длина строки. Этот подход может показаться поверхностно эквивалентным использованию std::basic_string::length() метод для длины строки.

Однако функция strlen(str) имеет линейную сложность O (N), где N - длина строкиstr. Если str имеет тип std::basic_string, эта сложность не нужна, поскольку вызывает std::basic_string::length() метод возвращает длину более эффективно (со сложностью O (1)).

Зафиксировать

Если строка имеет тип std::basic_string, чтобы получить длину строки, вместо использования функций длины строки, таких как strlen, например:

std::string s;
auto len = strlen(s.ctr());
использовать std::basic_string::length() способ, например:
std::string s;
auto len = s.length();

Повышение производительности может зависеть от используемого компилятора, реализации библиотеки и среды.

Информация о результатах

Группа: Производительность
Язык: C++
По умолчанию: Откл.
Синтаксис командной строки: INEFFICIENT_BASIC_STRING_LENGTH
Воздействие: среднее
Представлен в R2020a