我目前正在阅读Scott Meyer的“Effective Modern C ++”。在第42项中,他声称例如std::vector::emplace_back
通常(但并非总是)与使用push_back
一样快或甚至更快。他列出了至少应该至少同样快的三个条件,但是在这些条件并非完全满足的情况下没有提供反例。
有人可以向我提供一个示例,其中使用emplace_back
会导致性能严重低于使用push_back
吗?
答案 0 :(得分: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();
}
答案 1 :(得分:1)
这取决于“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)快。但是,这种比较并不公平。在比较绩效时,应考虑相关建设者的成本。
答案 2 :(得分:1)
本质上这归结为标准实现。从理论上讲,emplace 应该总是一样快或更快,但实际情况是没有标准库实现充分利用了这一点。
几年前他就这个问题发表过一次演讲:https://www.youtube.com/watch?t=3427&v=smqT9Io_bKo
查看演讲的前 1 小时以获得更详细的解释。演讲结束时的问答也很重要。