一个常见的编译器优化是所谓的返回值优化。这种优化基本上允许编译器不复制从函数返回的本地变量,而是将其移动。
然而,我在想如果对于按值传递参数到函数中,如果已知函数的返回值将覆盖原始参数,是否也可以做到同样的优化。
以下是一个示例。假设我们有以下函数:
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
在这种情况下,可以明确确定函数调用的返回值将覆盖传递到函数中的参数。我的问题是,当前编译器是否能够优化此代码,使得传递给函数的参数在传递时不被复制,或者这甚至可能是所谓的返回值优化的一部分。
更新
让我们考虑C++11,我想知道以下理解是否正确:如果通过值传递到函数参数的值是r值,并且参数的类型具有移动构造函数,则将使用移动构造函数而不是复制构造函数。
例如:
std::vector<Foo> bigData = /* big data */;
bigData = modify(std::move(bigData));
如果这个假设是正确的,那么在传递值时就会消除复制操作。从已经给出的答案来看,我提到的优化似乎不常见。看着这个手动方式,我真的不明白为什么,因为它似乎很容易实现。