Const parameter values may cause unnecessary data copies

Значения параметров const могут предотвратить операцию пересылки, приводящую к более интенсивной эффективностью операции копии

Описание

Этот дефект происходит когда const объекты как параметры функции могут предотвратить операцию пересылки, приводящую к более интенсивной эффективностью операции копии.

Средство проверки не проверяет, возможна ли операция пересылки в вызове заданной функции. Средство проверки просто подсвечивает const параметры функции, которые имеют типы классов с нетривиальной операцией копии и операцией пересылки. Можно определить для себя, если параметр может быть перемещен в вызванную функцию.

Риск

Если аргумент функции является rvalue, ресурсы, сопоставленные с аргументом, больше не требуются и могут быть перемещены в параметры в вызванной функции. Компиляторы гарантируют, что операция пересылки используется в этой ситуации, поскольку они являются обычно менее дорогими, чем операции копии. Если вы используете const возразите как параметр функции, вы явным образом предотвращаете эту компиляторную оптимизацию.

Фиксация

Если вы думаете, что параметр может быть перемещен в вызванную функцию, удалите const спецификатор от отмеченного параметра функции.

Примеры

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

#include <string>

std::string getStringFromUser() {
    //Get a string of arbitrary length
}

void countWordsInString(const std::string str) {
    //Count number of words in string
}

void main() {
    std::string aString = getStringFromUser();
    std::string anotherString = getStringFromUser();
    
    std::string joinedString = aString + anotherString;
    
    countWordsInString(joinedString);
    countWordsInString(aString + anotherString);
}

В этом примере средство проверки отмечает const str::string параметр str. В ситуациях, где операция пересылки возможна, например, в вызове:

countWordsInString(aString + anotherString);
const параметр обеспечивает операцию копии, которая может быть значительно более дорогой.

Проверяйте информацию

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