2015-10-05 72 views
3

我正在閱讀Scott Meyer的「Effective Modern C++」。在第42項中,他聲稱例如std::vector::emplace_back通常但不總是與使用push_back一樣快或甚至更快。他列出了三種條件,至少應該儘可能快,但是在這些條件不能全部得到滿足的情況下,不會提供反例。 有人可以提供一個例子,其中使用emplace_back預計會導致嚴重的性能比使用push_back其中std :: vector :: emplace_back比std :: vector :: push_back慢的示例?

+0

這不是一回事,但不能使用'emplace_back'作爲支撐初始化程序(例如,調用像'vecOfVecs.emplace_back({ 1,2,3});'),所以我想這會讓它不如'push_back'快。 – chris

+7

'他列出了三個條件? – user657267

+1

如果'emplace_back'實際上*速度較慢*,那將是一個非常隱晦和奇怪的情況。它通常相同或更好。 – sp2danny

回答

2

傻例如:

std::vector<always_throws_on_construction> vec; 
if(vec.size() == vec.capacity()) 
{ 
    vec.push_back(always_throws_on_construction()); 
} 

很可能會快於

std::vector<always_throws_on_construction> vec; 
if(vec.size() == vec.capacity()) 
{ 
    vec.emplace_back(); 
} 
+0

這種猜測的基本原理是什麼? – edmz

+0

@black在推回的情況下,您在運行任何向量代碼之前引發異常。在放回來的情況下,您動態地擴展矢量以便能夠處理新元素,然後拋出。就像我說的那樣,它是一個愚蠢的例子。 [編輯清除異常拋出] –

+0

噢。出於某種原因,我認爲你說的是​​相反的,這就是爲什麼我問。 – edmz

0

這取決於你的意思是 「emplace_backpush_back慢」。考慮類,它是構建昂貴和廉價複製,例如類與寫入時複製行爲,或類表示哈希值:

class Hash { 
    public: 
    int value; 
    Hash(const char *data) : value(very_expensive_hash_function(data)) {} // expensive 
    Hash(const Hash &other) : value(other.value) {} // cheap 
}; 
Hash h(foo); 
std::vector<Hash> v; 

v.push_back(h);  // 1 
v.emplace_back("foo"); // 2 

然後,(1)將確實快於(2)。但是,這種比較是不公平的。在比較性能時,應考慮構造函數的成本。