• 我写的一个简单的内存管理器


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



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

  • 相关阅读:
    git
    Django RestFramework
    vuex以及axios
    npm 、webpack 、 vue-cli
    vue的生命周期
    vue-router
    vue框架 (小清单)
    nodejs review-01
    npm-bluebird使用
    js整理4
  • 原文地址:https://www.cnblogs.com/len3d/p/815183.html
Copyright © 2020-2023  润新知