> > +    This->current = This->current +1;
> > +    HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, This->matrix, 
> > (This->current +1) * sizeof(D3DXMATRIX) );
> > +    if ( This->matrix == NULL ) return E_OUTOFMEMORY;

> Aside from being a bit suboptimal (doing a realloc on every push),
> this probably doesn't do what you want. Consider what happens to the
> size of the array when you do something like push/pop/push/pop/...etc.
> 
> It would be better to keep track of the current stack size, and then
> grow it by a factor (eg. 2 or 1.5) if a push would overflow the
> current stack. You could also consider shrinking the array again if a
> pop would make it use less than a certain percentage of the current
> size (eg. a third).
> 
> You should also assign the result of HeapReAlloc() to This->matrix
> again. Although it's quite possible for HeapReAlloc to just grow the
> current block without changing its location, there's no guarantee it
> will. The NULL check is useless this way.

Just a little addition, I think we should resize the stack differently at 
different situations, i.e.:
- resize it to (This->current+3) if This->currect<5 (something around that is 
the minimum number of matrices for which anyone would even bother using a 
MatrixStack)
- resize it to (This->current*2) if This->current<12 (when it seems like the 
application's gonna push many matrices on the stack)
- resize it to (This->current+16) if This->current>=12 (when *2 could waste 
memory)
However, I don't know if these numbers are optimal, it's just a suggestion.

For the Pop function, I agree that you should free some memory when it's 
unused, but my suggestion from above fits here, too. However, one third is 
okay, too, as it isn't that relevant here.











Reply via email to