Expensive use of std::string with empty string literal

Использование std::string с пустой строкой литерал может быть заменен менее дорогими вызовами std::basic_string функции членства

Описание

В вашем коде C/C++ средство проверки отмечает эти операции:

  • Построение экземпляра std::string при помощи литерала пустой строки

  • Присвоение литерала пустой строки к экземпляру std::string

  • Сравнение экземпляра std::string к литералу пустой строки

Указания и ограничения по применению:

  • Средство проверки не отслеживает источник const char переменные указателя, которые пусты и в конечном счете используются с std::string.

  • Это средство проверки является частично устаревшим, когда вы используете текущие компиляторы. Компиляторы, такие как GCC 5.1 и Визуальный Studio® 2015 оптимизируют конструкцию от литерала пустой строки и обрабатывают его как идентичный конструкции по умолчанию.

Риск

Предыдущие операции могут быть заменены вызовами конструктора по умолчанию и empty и clear функции членства std::basic_string шаблон класса. Определенные компиляторы могут сгенерировать дополнительные инструкции для явных операций по сравнению с использованием встроенных функций членства. Использование этих операций может уменьшать эффективность скомпилированного кода.

Фиксация

Замените явные операции, включающие литералы пустой строки этими вызовами конструктора по умолчанию и функций членства std::basic_string.

Не ИспользоватьИспользование
std::string s(""); std::string s;
std::string s = ""; std::string s;
s = ""; s.clear();
if (s == "") if (s.empty())
return ""; return {};
void foo(const std::string& s = "");void foo(const std::string& s = {});(C++ 11) или foo(const std::string &str2 = std::string())
foo(""); foo({}) (C++ 11) или foo(std::string())
Class::Class() : str("") {//...} Class::Class() : str() {//...}

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

Примеры

развернуть все

#include <iostream>
#include <string>

void compareString(const std::string &str1, const std::string &str2="")//Noncompliant
{
	if (str1 == "")//Noncompliant
	{
		std::cout << "The string is empty" << std::endl;
	}
	else
	{
		if (str1.compare(str2) != 0)
		std::cout << str1 << " is not " << str2 << '\n';
	}
}


void bar(){
	compareString("String1");
	compareString("String1","");//Noncompliant
}
В этом примере три строковых операции выполняются при помощи литералов пустой строки. Polyspace отмечает эти операции как неэффективные.

Коррекция — использует функции членства std::string

Устранить отмеченные проблемы, операции строки замены с литералами пустой строки с вызовами функций членства std::string. Например:

  • Замените const std::string &str2="" с const std::string &str2={}

  • Замените if(str1 == "") с if(str1.empty())

  • Замените compareString("String1","") с compareString("String1",{})

#include <iostream>
#include <string>

void compareString(const std::string &str1, const std::string &str2 = {})//Compliant
{
	if (str1.empty())//Cmpliant
	{
		std::cout << "The string is empty" << std::endl;
	}
	else
	{
		if (str1.compare(str2) != 0)
		std::cout << str1 << " is not " << str2 << '\n';
	}
}


void bar(){
	compareString("String1");
	compareString("String1",{});//Compliant
}

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

Группа: Производительность
Язык: C++
Значение по умолчанию: Off
Синтаксис командной строки: UNNECESSARY_EMPTY_STRING_LITERAL
Удар: низко
Введенный в R2021a