【发布时间】:2012-12-12 04:33:34
【问题描述】:
一个函数需要返回两个值给调用者。最好的实施方式是什么?
选项 1:
pair<U,V> myfunc()
{
...
return make_pair(getU(),getV());
}
pair<U,V> mypair = myfunc();
选项 1.1:
// Same defn
U u; V v;
tie(u,v) = myfunc();
选项 2:
void myfunc(U& u , V& v)
{
u = getU(); v= getV();
}
U u; V v;
myfunc(u,v);
我知道 Option2 没有复制/移动,但它看起来很难看。选项 1、1.1 中是否会发生任何复制/移动?让我们假设 U 和 V 是支持复制/移动操作的巨大对象。
问:理论上是否可以按照标准进行任何 RVO/NRVO 优化?如果是,gcc 或任何其他编译器是否已实现?
【问题讨论】:
-
我不知道任何关于
std::pair会抑制 RVO/NRVO 的信息。通过包含一个告诉您何时发生复制的复制构造函数,通常可以很容易地进行测试。 -
g++ 实现了防止复制对的 RVO,但是您仍然将 u 和 v 的副本复制到对中。
-
我进行了一些测试,我发现使用 g++,哪个更快取决于可能的内联以及 U 和 V 的复制构造函数的复杂性。如果您只是在寻找性能,我认为您必须对其进行分析以确定哪个最快。
-
这并不是您问题的真正答案,但我建议使用简单的结构而不是对。对是丑陋和沉重的重量。一旦我看到了类似 time.first 的代码;时间.秒;不可读。时间.分钟;时间.秒;好多了。
标签: c++ c++11 std-pair rvo nrvo