我正在閱讀Scott Meyer的「Effective Modern C++」。在第42項中,他聲稱例如std::vector::emplace_back
通常但不總是與使用push_back
一樣快或甚至更快。他列出了三種條件,至少應該儘可能快,但是在這些條件不能全部得到滿足的情況下,不會提供反例。 有人可以提供一個例子,其中使用emplace_back
預計會導致嚴重的性能比使用push_back
?其中std :: vector :: emplace_back比std :: vector :: push_back慢的示例?
3
A
回答
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
這取決於你的意思是 「emplace_back
比push_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)。但是,這種比較是不公平的。在比較性能時,應考慮構造函數的成本。
相關問題
- 1. emplace_back on std :: vector
- 2. std :: vector中的高效push_back
- 3. std :: vector bad_alloc不使用push_back
- 4. 錯誤與std :: vector push_back
- 5. 'std :: vector`中的`emplace_back`如何工作?
- 6. std :: vector <> :: emplace_back()安全嗎?
- 7. std :: vector比std :: unordered_set更快嗎?
- 8. 使用std :: vector <T*> :: push_back與std :: mem_fun和std :: bind1st
- 9. iterate std :: vector <std :: vector <char>>?
- 10. std :: vector :: push_back拋出分段錯誤
- 11. Atomically std :: vector :: push_back()並返回索引
- 12. 用boost :: program_options和push_back讀入std :: vector?
- 13. std :: vector中的push_back()<std::string>覆蓋當前字符串
- 14. Push_back map into vector
- 15. posix_memalign for std :: vector
- 16. 繼承std :: vector
- 17. vector push_back zero into empty vector
- 18. 指向std :: vector
- 19. 繼承std :: vector
- 20. sizeof()std :: vector(C++)
- 21. NSMutableArray to std :: vector
- 22. C++ std :: vector <std :: shared_ptr>
- 23. std :: list vs std :: vector迭代
- 24. std :: map初始化std :: vector
- 25. std :: bad_alloc之後std :: vector的狀態
- 26. std :: vector reserve()和push_back()比resize()和數組索引快,爲什麼?
- 27. std :: sort on std :: vector <std::string>
- 28. std :: vector :: resize in gcc4.2
- 29. std :: vector <T>
- 30. 手動中毒的std :: vector
這不是一回事,但不能使用'emplace_back'作爲支撐初始化程序(例如,調用像'vecOfVecs.emplace_back({ 1,2,3});'),所以我想這會讓它不如'push_back'快。 – chris
'他列出了三個條件? – user657267
如果'emplace_back'實際上*速度較慢*,那將是一個非常隱晦和奇怪的情況。它通常相同或更好。 – sp2danny