【发布时间】:2017-11-11 13:15:34
【问题描述】:
一种众所周知的编译器优化是所谓的返回值优化。这种优化基本上允许编译器不复制从函数返回的局部变量,而是移动它。
但是,我想知道如果知道函数的返回值将覆盖原始参数,是否也可以按值将参数传递给函数。
这是一个例子。假设我们有以下函数:
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值,并且参数的类型有move-constructor,那么会使用move构造函数而不是copy构造函数。
例如:
std::vector<Foo> bigData = /* big data */;
bigData = modify(std::move(bigData));
如果假设正确,则在传递值时会消除复制操作。从已经给出的答案看来,我之前提到的优化似乎并不常见。看着这种手动方法,我真的不明白为什么,因为似乎很容易应用。
【问题讨论】:
-
很难确切地回答,但如果我不得不打赌:我认为你永远不会得到这种优化除非函数是内联的。
-
“很难明确回答”——嗯,这很简单,只需要使用您感兴趣的编译器,然后查看生成的 asm。
-
@UKMonkey 对于特定功能、特定编译器、特定架构、特定标志,这很容易回答,是的,我同意。这个问题更加笼统,并且没有指定函数的主体,所以我不会说它“简单”。无论如何,我尽了最大的努力来回答。
标签: c++ optimization parameter-passing return-value-optimization