在 C++ 的 中, 和 都是用于在容器末尾添加元素的函数,但它们的底层机制和性能表现有显著的区别。 简单来说: 是“先创建对象,再拷贝/移动到容器中”,而 是“直接在容器的内存中原地构造对象”。 以下是详细的对比和解析: 1. 核心工作原理 它接收一个已经构造好的对象(左值或右值)。 如果是左值,它会调用类的拷贝构造函数,将对象复制到 vector 的内存中。 如果是右值(例如临时对象),它会调用类的移动构造函数,将对象移动到 vector 的内存中。 (C++11 引入) 它接收的是构造对象所需的参数(通过可变参数模板和完美转发实现)。 它直接在 vector 预先分配的内存上,调用类的构造函数来实例化对象。 完全省去了临时对象的创建、拷贝或移动的过程。 --- 2. 代码示例与性能对比 为了直观看出区别,我们定义一个包含打印信息的类: 输出结果: 结论:在传递多参数构造复杂对象时, 性能更高,因为它少了一次移动(或拷贝)操作和一次析构操作。 --- 3. 需要注意的陷阱 (Gotchas) 虽然 看起来更好,但它并不是完美的,有时会因为“过于聪明”而导致意想不到的 bug。...