当前在我写过的库中,我的小对象(不是多态的)在对象池中分配给一个带有unique_ptr
的向量。现在显然我想改变这种情况,因为很多次呼唤新人显然有很多头痛的问题。我很好奇它是否更有效:缓存池中的对象(将其存储在向量中,即vector<Object>
),或者在需要时通过它的ID创建对象。请注意,有很多创建的对象。在堆栈上分配一个小对象(比如在堆上创建一次)会更有效率吗?
我的意思是,我应该这样做:
需要时创建对象? (注意这些对象是小的,64-128位,因为所有被包含是一个ID和一个参考/指针到父对象)
Object ObjectFactory::create()
{
return Object(nextId(), getParent());
}
Object ObjectFactory::get(unsigned id)
{
return Object(id, getParent());
}
或:
Object& ObjectFactory::create()
{
// get the next id of the object
unsigned id = nextId();
// resize (if necessary)
if(_objects.size() <= id)
{
_objects.resize(id + 1);
_objects[id]._parent = getParent();
}
return _objects[id];
}
Object& ObjectFactory::get(unsigned id)
{ return _objects[id]; }
我什么特别关注的是:会重新创建的Object
的原因是多少?
有一个从这个问题一个失踪的细节:当您运行两个版本,一个是太多的开销? –
让我们暂时假设堆比堆栈慢100倍。你的应用程序会经常这样做吗,它会注意到这种差异?如果没有,有一个干净,易于使用和维护界面不是更重要吗? – PlasmaHH
将对象存储在连续内存中(std :: vector保证它)可以为您带来巨大的速度提升,而不是将它们存储在内存碎片区域。 – borisbn