假設我有一些物體,如:C++參考VS局部變量
std::map<int, std::vector<double> > some_map;
簡單問題:被更有效地執行以下操作
std::vector<double> vec = some_map[some_index];
或引用它
std::vector<double>& vec = some_map[some_index];
任何人都可以簡單地解釋一下幕後發生的典型事件嗎?
非常感謝!
假設我有一些物體,如:C++參考VS局部變量
std::map<int, std::vector<double> > some_map;
簡單問題:被更有效地執行以下操作
std::vector<double> vec = some_map[some_index];
或引用它
std::vector<double>& vec = some_map[some_index];
任何人都可以簡單地解釋一下幕後發生的典型事件嗎?
非常感謝!
兩者有不同的語義,不可互換。 第一個給你一個副本,你可以修改你想要的 ,但不需要改變地圖中的任何東西。第二個給出 你對地圖中的數據元素的引用;任何 修改修改地圖的內容。此外,儘管 可能不是問題,但請注意,如果地圖在參考超出範圍之前被破壞 ,則引用將爲 懸停。
關於性能,它取決於向量中的內容, 以及之後的處理方式;在大多數情況下,參考 可能會有更好的性能,但您不應該擔心 它直到探查器說您必須。 (如果你使用 參考,使其const
,除非你真的希望能夠 修改地圖的內容。)
創建引用更高效,但您應該注意這兩個語句在語義上有所不同,並且具有不同的行爲。
如果你
std::vector<double> vec = some_map[some_index];
的std::vector
的拷貝構造函數被調用到整個矢量some_map[some_index]
複製到vec
。用這種方法,你會得到一個新的新的矢量vec
。它們是獨立的對象,對vec
的任何更改都不會影響原始地圖。
如果使用
std::vector<double>& vec = some_map[some_index];
然後vec
直接指some_map[some_index]
並避免複製。但是,請注意,如果稍後更改vec
,則更改將反映在vec
和some_map[some_index]
之間,因爲它們指向相同的對象。爲了防止不希望的變化,這是更安全的使用量引用:
const std::vector<double>& vec = some_map[some_index];
引用是更有效,無論是在所使用的內存的術語和CPU週期。您的第一行代碼創建了一個向量的副本,其中包括複製向量中的每個項目。第二,你只是指現有的矢量。沒有複製。
謝謝你,詹姆斯只是快一點:-) –
在語義的不同可能比任何性能上的差異更爲重要。 –
2不同的實現有2個不同的目標,通過值聲明變量使您能夠修改變量,而不會有修改原始值的風險。 – Subhajit