我在表演中玩了一段时间,我仍然不确定,什么是最好的解决方案。
我阅读了很多文章,并且自己进行了性能测试:
例如,让我们拿一个包含很多元素的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会更好吗,但是怎么样? 或者还有其他解决方案吗?
答案 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平台上更快。
如果您需要在两个平台上获得最快的方法,我担心您将需要使用预处理器命令。