Аргумент, являющийся структурой или классом, передается в функцию по значению. Проверив тело функции, анализатор определил, что этот аргумент не модифицируется. С целью оптимизации такой аргумент можно передавать как константную ссылку.
Это может ускорить выполнение программы, поскольку при вызове функции будет скопирован только адрес, а не весь объект класса. Особенно заметна оптимизация, если класс содержит большой объём данных.
Рассмотрим пример:
void foo(Point p)
{
float x = p.x;
float y = p.y;
float z = p.z;
float k = p.k;
float l = p.l;
// далее аргумент 'p' никак не используется
}
Исправить такой код очень легко — достаточно изменить сигнатуру функции:
void foo(const Point &p)
{
....
}
Примечание N1. Для обратных ситуаций, когда выгоднее передача по значению, предусмотрено диагностическое правило V835.
Примечание N2. Пользователь может сам указать размер структур, которые выгоднее передавать по копии.
Например, чтобы анализатор выдавал предупреждения только для структур размером более 32 байт, в исходном коде или в файле конфигурации (.pvsconfig) можно написать комментарий:
//V_CHEAP_TO_COPY_THRESHOLD=32
Значение по умолчанию, при котором анализатор считает, что объект выгоднее передавать по копии, равняется размеру двух указателей на целевой платформе. Например, на большинстве платформ с 64-битной архитектурой размер указателя составляет 8 байт, поэтому на них значение по умолчанию равно 16 байтам.
Вы также можете указать эту настройку только для конкретной платформы. Сделать это можно с помощью секций настроек в файле конфигурации(.pvsconfig).
Например, мы рекомендуем для Windows x64 выставить значение в 8 байт, т.к. это соответствует конвенции вызовов Microsoft x64. Для этого в файл конфигурации (.pvsconfig) нужно добавить следующее содержимое:
//V_SECTION_BEGIN
//V_WHEN_TARGET_OS: Windows
//V_WHEN_TARGET_ARCH: x64
//V_CHEAP_TO_COPY_THRESHOLD=8
//V_SECTION_END
Примечание N3. Анализатор не всегда может достоверно вывести информацию о модификации аргумента внутри функции. Для подавления таких предупреждений можно воспользоваться одним из способов, описанных в документации.
Была ли полезна эта страница документации?