一個函數需要返回兩個值給調用者。什麼是最好的實施方式?返回std :: pair時會發生RVO嗎?
選項1:
pair<U,V> myfunc()
{
...
return make_pair(getU(),getV());
}
pair<U,V> mypair = myfunc();
選項1.1:
// Same defn
U u; V v;
tie(u,v) = myfunc();
選項2:
void myfunc(U& u , V& v)
{
u = getU(); v= getV();
}
U u; V v;
myfunc(u,v);
我知道與選項2,有沒有拷貝/移動,但它看起來醜陋。 Option1,1.1中是否會出現複製/移動?讓我們假設U和V是支持複製/移動操作的巨大對象。
問:從理論上講,根據標準進行RVO/NRVO優化是否可行?如果是,是否已經實現了gcc或其他編譯器?
我不知道的關於'的std :: pair'任何會抑制RVO/NRVO。通過包含一個可以告訴你何時發生副本的拷貝構造函數來測試通常相當容易。 –
g ++實現了阻止複製對的RVO,但是您仍然擁有u和v的副本。 –
我運行了一些測試,發現使用g ++,哪一個更快取決於內聯的可能性以及U和V的複製構造函數的複雜性。如果你只是在尋找性能,我想你會必須對其進行配置以確定哪個最快。 –