Одна из широко известных оптимизаций компилятора - это так называемая оптимизация возвращаемого значения. Эта оптимизация в основном позволяет компилятору не копировать локальную переменную, возвращаемую функцией, а вместо этого перемещать ее.
Однако мне было интересно, возможно ли то же самое для передачи аргументов функции по значению, если известно, что возвращаемое значение функции перезапишет исходный аргумент.
Вот пример. Предположим, у нас есть следующая функция:
std::vector<Foo> modify(std::vector<Foo> data) {
/* Do some funny things to data */
return data;
}
Затем эта функция используется следующим образом:
std::vector<Foo> bigData = /* big data */;
bigData = modify(bigData); // Here copying the data into the function could be omitted
Теперь в этом случае можно четко определить, что возвращаемое значение вызова функции переопределит аргумент, который передается в функцию для каждого значения. Мой вопрос в том, могут ли нынешние компиляторы оптимизировать этот код таким образом, чтобы аргумент data
не копировался при передаче функции, или это может даже быть частью так называемой оптимизации возвращаемого значения.
Обновить
Учтем C ++ 11. Интересно, верно ли следующее понимание: если значение, переданное параметру функции по значению, является r-значением, а тип параметра имеет конструктор перемещения, конструктор перемещения будет использоваться вместо конструктора копирования.
Например:
std::vector<Foo> bigData = /* big data */;
bigData = modify(std::move(bigData));
Если это предположение верно, это исключает операцию копирования при передаче значения. Судя по уже полученным ответам, оптимизация, о которой я говорил ранее, обычно не применяется. Глядя на этот ручной подход, я действительно не понимаю, почему, поскольку его довольно просто применить.