返回一个容器

时间:2014-11-14 19:05:02

标签: c++ c++11 return-value

我在表演中玩了一段时间,我仍然不确定,什么是最好的解决方案。

我阅读了很多文章,并且自己进行了性能测试:

例如,让我们拿一个包含很多元素的Container(例如字符串向量)。复制它会非常昂贵。 因此,将其作为参考返回将是一个很好的解决方案。

//Vector
vector<string>& GetVector()
{
    return vecy;
}

我已经在Windows 8.1 VS2013 Express上测试了这个解决方案(在循环中)&amp;标准版本构建(02优化) 与价值回报。

差异很大,并且参考的速度非常快。

今天我使用XCode在MAC OS-X上进行了相同的测试,使用-0s优化标准版本。

在这里,按值返回比通过引用返回要快得多(似乎优化效果更好)。

我的第一个问题是:现在哪个是最好的解决方案?或者没有最佳解决方案,我只需要将代码调整到编译器?

我知道另一个解决方案是使用c ++ 11移动,但是如果我想将矢量保留在我的对象上,还有我调用GetVector()的地方呢? (但没有副本)。

2)问题:

关于代码

你有什么看法?
vector<string> vec;

vector<string>* GetVector()
{
 return &vec
}

通话功能:

vector<string>* vec2 = GetVector();

(让我们确切地知道对象存在多长时间,这会将指针返回到我的向量)

在我的性能测试中使用带指针的方法是最快的,但这是一个很好的解决方案吗? 使用smart_poin会更好吗,但是怎么样? 或者还有其他解决方案吗?

3 个答案:

答案 0 :(得分:1)

对于getter,只需返回(const)引用。

要构建一个向量(从C ++ 11开始),按值返回(最坏的情况是你有一个移动)。

答案 1 :(得分:0)

在C ++ 11中,如果它不是共享对象,您只需执行以下操作即可利用移动构造函数:

vector<string> GetVector()
{ 
   // do something
   return vec;
}

答案 2 :(得分:0)

您无法比较不同平台上编译器处理STL容器的基准速度。通过代码处理STL容器在编译器级别进行了优化,您将得到不同的结果。

std :: map很可能与std :: vector完全不同,例如在Windows平台上更快。

如果您需要在两个平台上获得最快的方法,我担心您将需要使用预处理器命令。