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 и Visual 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