【发布时间】:2011-05-02 05:53:08
【问题描述】:
我正在考虑开发一些命名参数代码,但它让我想到了一些类似以下的代码:
#include <utility>
int main()
{
using std::make_pair;
auto x = make_pair(1, make_pair(2, make_pair(3, make_pair(4,5))));
}
现在,一个简单的实现会首先执行“make_pair(4,5)”,然后将结果复制到“make_pair(3, ...)”的第二个元素中,然后将其复制到第二个元素中“make_pair(2, ...)”等
不幸的是,这将导致 O(n^2) 性能,并带有很多不必要的副本。我也看不出(命名的)返回值优化在这里有什么帮助。
理想情况下,make_pair(4,5)意识到它将在x的最后一个位置,并在那个位置构建自己。
更进一步:
#include <utility>
int main()
{
using std::make_pair;
auto&& x1 = make_pair(3, make_pair(4,5));
auto x2 = make_pair(1, make_pair(2, std::move(x1)));
}
我也想避免在这样的代码中复制。
这种优化是否如此明显以至于我应该假设编译器会执行它,或者我应该以其他方式对其进行编码以避免复制?
【问题讨论】:
-
即使使用当前的 C++ 和体面的编译器,代码也不会产生任何不必要的副本(我用 g++ 编写了一个小测试,生成的汇编代码中没有副本)。
-
像这样的陈述:
我看不出(命名的)返回值优化在这里有什么帮助
会让你大吃一惊。程序员真的不善于理解编译器的实际作用。试一试,看看实际发生了什么。然后你可以做出如下语句:编译器无法发现优化 X 如何让我的代码对编译器更友好
标签: c++ optimization rvalue-reference c++11