std :: vector :: emplace_back比std :: vector :: push_back慢的例子?

时间:2015-10-05 05:14:03

标签: c++ performance vector

我目前正在阅读Scott Meyer的“Effective Modern C ++”。在第42项中,他声称例如std::vector::emplace_back通常(但并非总是)与使用push_back一样快或甚至更快。他列出了至少应该至少同样快的三个条件,但是在这些条件并非完全满足的情况下没有提供反例。 有人可以向我提供一个示例,其中使用emplace_back会导致性能严重低于使用push_back吗?

3 个答案:

答案 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 小时以获得更详细的解释。演讲结束时的问答也很重要。