c++ - std::vector::emplace_back 比 std::vector::push_back 慢的示例?

标签 c++ performance vector

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

最佳答案

这取决于您所说的“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) 快。然而,这样的比较并不公平。比较性能时,应考虑所涉及的构造函数的成本。

关于c++ - std::vector::emplace_back 比 std::vector::push_back 慢的示例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32941695/

相关文章:

c++ - "crosses initialization of variable"仅当初始化结合声明时

c++ - 通过引用传递原始类型而不是按值返回有什么效率优势?

performance - 缓慢的Elasticsearch摄取

c++ - 将数据推回二维 vector

c++ - 遍历没有开始和结束的 vector

java - g++ 编译后的核心转储 + 与 jni 的链接以及随后使用 C++ 和 Java 执行的应用程序

c++ - 如何使用 uBLAS 转置矩阵?

C++ getter/setter、互斥量、细粒度锁定

c++ - if-initializer 中的 lock_guard 初始化而不是简单的作用域

c++ - vector 数组删除不起作用