![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif) template< int ALIGN > class MemPage {
public:
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) inline MemPage( UINT _size, MemPage *oldPage ) {
UINT asize = MAX( _size, MEMORY_PAGE_SIZE );
head = _mm_malloc( asize, ALIGN );
page = (BYTE *) head;
_next = oldPage;
size = asize;
}
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) inline MemPage( void *ptr, UINT _size, MemPage *oldPage ) {
head = NULL;
page = (BYTE *) ptr;
_next = oldPage;
size = _size;
}
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) inline ~MemPage() {
if( head )
_mm_free( head );
}
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) inline UINT available() {
return size;
}
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) inline void *alloc( UINT _size ) {
void *ptr = page;
page += _size;
size -= _size;
return ptr;
}
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) inline MemPage *next() {
return _next;
}
private:
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) union {
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) struct {
void *head;
BYTE *page;
MemPage *_next;
UINT size;
};
__m128 aligned;
};
};
![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif) template < typename T, int ALIGN > class MemPool {
public:
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) inline MemPool() {
thePage = NULL;
theChunk = NULL;
allocated = 0;
inited = 0;
}
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) inline void init() {
thePage = NULL;
theChunk = NULL;
allocated = 0;
inited ++;
}
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) inline void destory() {
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) if( inited == 1 ) {
MemPage< ALIGN > *cPage;
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) while( ( cPage = thePage ) != NULL ) {
thePage = cPage->next();
delete cPage;
}
}
inited --;
}
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) inline void *alloc( UINT size ) {
void *ptr;
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) if( theChunk == NULL || size > theChunk->available() ) {
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) if( thePage == NULL || size > thePage->available() ) {
if( !inited )
init();
thePage = new MemPage< ALIGN > ( size, thePage );
}
ptr = thePage->alloc( size );
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) } else {
MemPage< ALIGN > *cPage = theChunk;
ptr = cPage->alloc( size );
theChunk = cPage->next();
}
allocated ++;
return ptr;
}
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) inline void dealloc( void * ptr ) {
allocated --;
if( allocated == 0 )
destory();
}
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif) inline void dealloc( void * ptr, UINT size ) {
if( size > sizeof(MemPage< ALIGN >) )
theChunk = new (ptr) MemPage< ALIGN > ( (BYTE *)ptr + sizeof(MemPage< ALIGN >),
size - sizeof(MemPage< ALIGN >), theChunk );
allocated --;
if( allocated == 0 )
destory();
}
private:
MemPage< ALIGN > *thePage, *theChunk;
UINT inited, allocated;
};
用我的渲染器测试了一下,速度还是很快的。。。
|