why does m_nodes.reserve(m_nodes.size()*2+1) do this?

stp
Posts: 1
Joined: Tue Feb 18, 2014 9:11 pm

why does m_nodes.reserve(m_nodes.size()*2+1) do this?

Post by stp »

why does line 225 in bullet 2.77 btSoftBody.cpp reserve m_nodes.size()*2+1 ?

Code: Select all

m_nodes.reserve(m_nodes.size()*2+1);
why not m_nodes.size()+1 ?

Code: Select all

m_nodes.reserve(m_nodes.size()+1);
seems like this is causing a problem when you try and append nodes and tetras (i haven't extensively tested this though)

Code: Select all

void			btSoftBody::appendNode(	const btVector3& x,btScalar m)
{
	if(m_nodes.capacity()==m_nodes.size())
	{
		pointersToIndices();
		m_nodes.reserve(m_nodes.size()*2+1);
		indicesToPointers();
	}
	const btScalar	margin=getCollisionShape()->getMargin();
	m_nodes.push_back(Node());
	Node&			n=m_nodes[m_nodes.size()-1];
	ZeroInitialize(n);
	n.m_x			=	x;
	n.m_q			=	n.m_x;
	n.m_im			=	m>0?1/m:0;
	n.m_material	=	m_materials[0];
	n.m_leaf		=	m_ndbvt.insert(btDbvtVolume::FromCR(n.m_x,margin),&n);
}
xexuxjy
Posts: 225
Joined: Wed Jan 07, 2009 11:43 am
Location: London

Re: why does m_nodes.reserve(m_nodes.size()*2+1) do this?

Post by xexuxjy »

It's a general pattern for resizing collections, growing it by 1 each time can be very in-efficient as you re-allocate memory each time you add a single item. Doubling up like this usually works better , though you sometimes have to keep an eye on it to avoid lots of unused space.