【发布时间】:2017-03-15 22:48:56
【问题描述】:
在标准集合中存储对象时,在决定存储值还是存储指针时应该考虑哪些因素?这些集合的所有者(ObjectOwner)在堆上分配。对于小型结构/对象,我一直在存储值,而对于大型对象,我一直在存储指针。我的理由是,当标准容器调整大小时,它们的内容会被复制(小副本好,大副本坏)。这里还有什么要记住的吗?
class ObjectOwner
{
public:
SmallObject& getSmallObject(int smallObjectId);
HugeObject* getHugeObject(int hugeObjectId);
private:
std::map<int, SmallObject> mSmallObjectMap;
std::map<int, HugeObject *> mHugeObjectMap;
};
编辑:
上面的示例以获得更多上下文:
- 相对不频繁地创建/删除存储在 std::map 中的项目(每秒几次)
- 经常从 std::map 获取(每 10 毫秒一次)
- 小对象:
- 巨大的对象:> 1024 字节
【问题讨论】:
-
“我的理由是,当标准容器调整大小时,它们的内容会被复制”——取决于容器。完全没有这个要求;事实上,对于大多数容器来说这是错误的
-
“这里还有什么要记住的吗?”如果可以的话,使用智能指针而不是原始指针
-
@UKMonkey 确实,在大多数容器中调整大小不是问题,但破坏和构造才是问题,这对大型对象来说代价高昂。
-
@imreal 你必须构造和破坏对象,不是吗?
-
@imreal 正如 UKMonkey 所说,一个解决方案是使用智能指针:
shared_ptr允许共享对象的属性,或unique_ptr用于独占属性
标签: c++