我正在阅读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