2014-11-14 104 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平臺上會更快。

如果您需要在兩個平臺上獲得最快的方法,恐怕您需要使用預處理器命令。