我应该使用c++ 11的emplace_back指针容器吗?
Should I use C++11 emplace_back with pointers containers?
有一个通常的基础->派生层次结构,如:
class Fruit { ... };
class Pear : Fruit { ... };
class Tomato : Fruit { ... };
std::vector<Fruit*> m_fruits;
使用emplace_back
而不是push_back
有意义吗(例如:性能更好吗)?
std::vector::emplace_back( new Pear() );
std::vector::emplace_back( new Tomato() );
不要使用原始指针,像这样使用std::unique_ptr
:
std::vector<std::unique_ptr<Fruit>> m_fruits;
由于您不能复制构建std::unique_ptr
,您必须使用emplace_back
(尽管您可以使用push_back
和std::move
)。
<> <>之前m_fruits。emplace_back(新梨());m_fruits。emplace_back番茄()(新);
编辑:如果std::vector
需要并且没有重新分配内存,那么使用std::vector<std::unique_ptr<T>>::emplace_back
和new
可能会泄漏,我推荐的方法(直到c++ 14引入std::make_unique
)是像这样使用push_back
:
m_fruits.push_back(std::unique_ptr<Fruit>(new Pear()));
m_fruits.push_back(std::unique_ptr<Fruit>(new Tomato()));
或者使用std::make_unique
:
m_fruits.push_back(std::make_unique<Pear>());
m_fruits.push_back(std::make_unique<Tomato>());
指针是标量类型,因此是文字类型,因此copy、move和emplace构造(来自左值或右值)都是等效的,并且通常会编译成相同的代码(标量复制)。push_back
更清楚地表明你正在执行标量复制,而emplace_back
应该保留给调用非复制或移动构造函数(例如转换或多参数构造函数)的放置构造。
如果你的向量应该保存std::unique_ptr<Fruit>
而不是原始指针(以防止内存泄漏),那么因为你调用转换构造函数emplace_back
将更正确。但是,如果扩展向量失败,仍然可以泄漏,所以在这种情况下,你应该使用push_back(make_unique<Pear>())
等
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用指针从C++中的数组中获取最大值
- 助记符和指向成员语法的指针
- 嵌入方指针压缩已禁用
- 数组的指针从不分段故障
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 何时在引用或唯一指针上使用移动语义
- QMetaObject invokeMethod的基于函数指针的语法
- 如何从 std::atomic 中提取指针 T<T>?
- 如何在 C# 中映射双 C 结构指针?
- C++将浮点指针值舍入为小数位数
- 为什么++(*p)更改指针值
- 调整大小后指向元素值的指针unordered_map有效?
- 正在将指针转换为范围
- 线路抑制状态错误 C4703 可能未初始化的局部指针变量"back"已使用
- push(ing)back在循环中对象指针
- 带有指针的push_back()和back()的行为