2013-10-25 38 views
0

比較在這個例子中:在C++中的RNG實際成本與REF

#include <iostream> 
#include <vector> 
#include <string> 

typedef std::vector<std::string> vs; 

vs test1() 
{ 
    vs strings; 
    strings.push_back("a"); 
    strings.push_back("b"); 
    strings.push_back("c"); 
    return strings; 
} 

void test2(vs& strings) 
{ 
    strings.push_back("a"); 
    strings.push_back("b"); 
    strings.push_back("c"); 
} 

int main() 
{ 
    vs data = test1(); 
    test2(data); 
    return 0; 
} 

我測試兩種方式來填充字符串的向量。 我認爲,在第一種情況下,我們複製向量,在第二種情況下,它可能更好,因爲我們只給出向量的引用。 那麼,什麼是好方法,副本是電腦的一個非常大的成本?

謝謝你的回答!

+1

大多數現代編譯器會生成可能效率相同的代碼。雖然請注意,你最終會在'data'中包含6個字符串 - 這是你期望的嗎? – Nick

+1

你的功能做不同的事情。如果你想保證他們做同樣的事情,你將不得不在第一個版本中檢查和/或清除輸入,這會產生一些開銷。你也必須記錄它。 – juanchopanza

+1

@ godel9不幸的是,選擇的答案似乎暗示了使用這兩個選項中較差的一個。 – juanchopanza

回答

3

爲了清楚起見,我建議第一個。由於NRVO,應該不會對性能產生影響。

如果目的是創建一個新的對象並返回它,第一個。如果要修改現有的,則使用第二個。

他們不完全做同樣的事情:

int main() 
{ 
    vs data{"test"}; 
    data = test1(); 
    //data is {a, b, c} 

    vs data2{"test"}; 
    test2(data2); 
    //data is {test, a, b, c} 
    return 0; 
} 
2

第一個創建了一個新的載體,也只是那些三根弦。第二個,在現有矢量的末尾添加這三個字符串。所以,的功能有點不同

在性能的情況下,由於有(N)RVO和移動語義,您可以使用第一個更清晰的語義。