我在演出中玩了一段时间,但我仍然不确定,最佳解决方案是什么。退货集装箱
我读了很多文章,也做性能测试我的自我:
例如,让我们一起来集装箱(字符串e.g载体)有很多的元素。复制它会非常昂贵。因此,将其作为参考返回将是一个很好的解决方案。
//Vector
vector<string>& GetVector()
{
return vecy;
}
我测试在Windows 8.1 VS2013快递这个解决方案(在一个循环OFC)&标准发布版本(02优化) 与由价值回归。
区别非常大,并且参考的速度非常快。
今天我使用XCode对MAC OS-X进行了相同的测试,该标准版本构建使用-0s优化。
这里,按值返回比通过引用返回要快得多(看起来好像,优化效果更好)。
我的第一个问题是:现在哪个是最好的解决方案?还是没有最好的解决方案,我只需要调整我的代码到编译器?我知道另一个解决方案是使用C++ 11移动,但是如果我想将矢量保留在我的对象上,而且还要将其称为GetVector(),那么该怎么办? (但没有副本)。
2)问:
你有什么可爱之处下面的代码
vector<string> vec;
vector<string>* GetVector()
{
return &vec
}
通话功能:
vector<string>* vec2 = GetVector();
(比方说,我知道对象的生活究竟有多长,它返回指向我的向量的指针)
使用这种方法与指针是快在我的性能测试中,这是一个很好的解决方案吗? 它会更好地使用smart_pointers,但如何? 或者还有其他解决方案吗?
Q2 - 这不是一个好的解决方案,因为你会长期搞砸内存管理。如果你的'vector vec'不是静态/全局的,那么当你想在其他地方使用它时,地址是如何有效的?你应该使用'std :: shared_ptr <>'。 Q1 - 我相信在C/C++内存管理中触及一个非常常见而又敏感的领域时,会有很多关于此的意见不一。我会等待看看别人的回答。 –
ha9u63ar
2014-11-14 19:10:46
你能展示你的基准代码(和结果)吗? – Jarod42 2014-11-14 19:44:15
我刚刚向矢量添加了50个字符串,并且在循环中调用了vector = GetVector()约30000000。测试表明,在支持LLVM C++ 11的情况下,使用按值返回的速度更快,使用GNU C++时,通过引用返回更快,我还认识到使用GNU C++的参考返回速度比LLVM C++快3倍11按价值回报。 IS C++ 11在返回值方面速度较慢,还是只是编译器? – jeromintus 2014-11-17 08:50:43