zoukankan      html  css  js  c++  java
  • 我写的一个简单的内存管理器

    template< int ALIGN > class MemPage {
    public:
        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;
        }

        inline MemPage( 
    void *ptr, UINT _size, MemPage *oldPage ) {
            head 
    = NULL;
            page 
    = (BYTE *) ptr;
            _next 
    = oldPage;
            size 
    = _size;
        }

        inline 
    ~MemPage() {
            
    if( head )
                _mm_free( head );
        }

        inline UINT    available() 
    {
            
    return size;
        }

        inline 
    void    *alloc( UINT _size ) {
            
    void *ptr = page;
            page 
    += _size;
            size 
    -= _size;
            
    return ptr;
        }

        inline MemPage    
    *next() {
            
    return _next;
        }

    private:
        union 
    {
            
    struct {
                
    void        *head;
                BYTE        
    *page;
                MemPage        
    *_next;
                UINT        size;
            }
    ;
            __m128            aligned;
        }
    ;
    }
    ;

    template 
    < typename T, int ALIGN > class MemPool {
    public:
        inline MemPool() 
    {
            thePage 
    = NULL;
            theChunk 
    = NULL;
            allocated 
    = 0;
            inited 
    = 0;
        }

        inline 
    void init() {
            thePage 
    = NULL;
            theChunk 
    = NULL;
            allocated 
    = 0;
            inited 
    ++;
        }

        inline 
    void destory() {
            
    if( inited == 1 ) {
                MemPage
    < ALIGN >    *cPage;
                
    while( ( cPage = thePage ) != NULL ) {
                    thePage 
    = cPage->next();
                    delete cPage;
                }

            }

            inited 
    --;
        }

        inline 
    void    *alloc( UINT size ) {
            
    void    *ptr;
            
    if( theChunk == NULL || size > theChunk->available() ) {
                
    if( thePage == NULL || size > thePage->available() ) {
                    
    if!inited )
                        init();
                    thePage 
    = new MemPage< ALIGN > ( size, thePage );
                }

                ptr 
    = thePage->alloc( size );
            }
     else {
                MemPage
    < ALIGN >    *cPage = theChunk;
                ptr 
    = cPage->alloc( size );
                theChunk 
    = cPage->next();
            }

            allocated 
    ++;
            
    return ptr;
        }

        inline 
    void    dealloc( void * ptr ) {
            allocated 
    --;
            
    if( allocated == 0 )
                destory();
        }

        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;
    }
    ;



    用我的渲染器测试了一下,速度还是很快的。。。

  • 相关阅读:
    人生转折点:弃文从理
    人生第一站:大三暑假实习僧
    监听器启动顺序和java常见注解
    java常识和好玩的注释
    182. Duplicate Emails (Easy)
    181. Employees Earning More Than Their Managers (Easy)
    180. Consecutive Numbers (Medium)
    178. Rank Scores (Medium)
    177. Nth Highest Salary (Medium)
    176. Second Highest Salary(Easy)
  • 原文地址:https://www.cnblogs.com/len3d/p/815183.html
Copyright © 2011-2022 走看看