2014-11-14 98 views
0

我在演出中玩了一段时间,但我仍然不确定,最佳解决方案是什么。退货集装箱

我读了很多文章,也做性能测试我的自我:

例如,让我们一起来集装箱(字符串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,但如何? 或者还有其他解决方案吗?

+3

Q2 - 这不是一个好的解决方案,因为你会长期搞砸内存管理。如果你的'vector vec'不是静态/全局的,那么当你想在其他地方使用它时,地址是如何有效的?你应该使用'std :: shared_ptr <>'。 Q1 - 我相信在C/C++内存管理中触及一个非常常见而又敏感的领域时,会有很多关于此的意见不一。我会等待看看别人的回答。 – ha9u63ar 2014-11-14 19:10:46

+2

你能展示你的基准代码(和结果)吗? – Jarod42 2014-11-14 19:44:15

+0

我刚刚向矢量添加了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

回答

0

在C++ 11,如果它不是一个共享对象可以通过简单地做利用移动构造的:

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

所以按值返回会自动使用移动构造函数吗?这正是我在Windows上VS2013所做的,它非常慢。但它在OS-X上很快。据我所知,这两个都支持C++ 11 – jeromintus 2014-11-14 19:19:30

+0

是自动的,你可以通过std :: move(vec)强制它。 – dynamic 2014-11-14 19:20:42

+0

但这意味着,我的向量将不会在当前对象中可用 – jeromintus 2014-11-14 19:22:08

1

对于吸气剂,简单地通过(const)参考返回。

要建立一个向量(自C++ 11以来),按值返回(最坏的情况下,你有一个动作)。

+0

但为什么它在VS2013这么慢? 参数如何。 void函数(矢量&vec){...}应该在这里也避免引用? – jeromintus 2014-11-14 19:39:56

0

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

很可能std :: map的行为完全不同于std :: vector,并且在Windows平台上会更快。

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