此代碼:C++返回值優化
#include <vector>
std::vector<float> getstdvec() {
std::vector<float> v(4);
v[0] = 1;
v[1] = 2;
v[2] = 3;
v[3] = 4;
return v;
}
int main() {
std::vector<float> v(4);
for (int i = 0; i != 1000; ++i)
{
v = getstdvec();
}
}
我這裏不正確的理解是,該功能getstdvec不應該有實際分配,它的返回向量。當我在valgrind/callgrind中運行它時,我發現有1001個malloc調用; 1用於main中的初始向量聲明,每個循環迭代1000次。
什麼給?我怎樣才能從這樣的函數中返回一個矢量(或任何其他對象),而不必每次都分配它?
編輯:我知道我可以通過引用傳遞向量。我的印象是,有可能(甚至最好)編寫這樣的函數,返回一個對象而不會產生不必要的分配。
對於您的編輯:我們需要一個您正試圖解決的問題的實例,而不是這個極其微小的示例代碼,以幫助提供非通過參考的解決方案。 –
@MarkB,它的確如此簡單:我想要一個返回矢量而不必進行不必要的複製/分配的函數。我的印象是,與RVO或rvalues有關的東西會使這件事情變得非常簡單。一個簡單的現實世界的例子就是嘗試對向量y和x以及標量k做y = k * x。傳統的傳遞參考函數看起來像'void mult(const float&k,const vec&x,vec&y)'。但顯然函數調用'y = mult(k,x)'比'mult(k,x,y)'更可取。 – Aurelius
RVO(返回值優化)是編譯器對您的代碼執行的操作。你的代碼需要首先做一些可以優化的東西(例如傳遞一個臨時的東西,例如分配給同一個對象)。你可能已經看過那個代碼並且認爲 - 嗯,我可以通過傳遞一個對getstdvec的引用來優化它。爲什麼編譯器不這樣做?那麼,傳遞參考並不代表你的代碼。你只能期望編譯器優化你的代碼所做的事情 - 而不是它可以做的事情。 – iheanyi