我正在考虑开发一些命名参数代码,但它让我想到了一些如下代码:
#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)));
}
我也想避免在这样的代码中复制。
这种优化是否如此明显以至于我应该假设编译器会执行它,或者是否有另一种方式我应该对其进行编码以避免复制?