我在演出中玩了一段時間,但我仍然不確定,最佳解決方案是什麼。退貨集裝箱
我讀了很多文章,也做性能測試我的自我:
例如,讓我們一起來集裝箱(字符串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