利用union实现内存池(boost::quick_allocator)

本文介绍了一种基于模板的内存池分配器实现方法,通过使用不同大小的内存池来优化小对象的分配与释放过程,减少内存碎片并提高效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//  根据size的不同, 可以实现不同大小的多个内存池

template<unsigned size, unsigned align_> union freeblock

{

    typedef typename boost::type_with_alignment<align_>::type aligner_type;

    aligner_type aligner;

    // 这个地方利用union真的很棒

    char bytes[size];

    freeblock * next;

};

 

template<unsigned size, unsigned align_> struct allocator_impl

{

    typedef freeblock<size, align_> block;

 

    // It may seem odd to use such small pages.

    //

    // However, on a typical Windows implementation that uses

    // the OS allocator, "normal size" pages interact with the

    // "ordinary" operator new, slowing it down dramatically.

    //

    // 512 byte pages are handled by the small object allocator,

    // and don't interfere with ::new.

    //

    // The other alternative is to use much bigger pages (1M.)

    //

    // It is surprisingly easy to hit pathological behavior by

    // varying the page size. g++ 2.96 on Red Hat Linux 7.2,

    // for example, passionately dislikes 496. 512 seems OK.

 

#if defined(BOOST_QA_PAGE_SIZE)

 

    enum { items_per_page = BOOST_QA_PAGE_SIZE / size };

 

#else

 

    enum { items_per_page = 512 / size }; // 1048560 / size

 

#endif

 

#ifdef BOOST_HAS_THREADS

 

    static lightweight_mutex & mutex()

    {

        static freeblock< sizeof( lightweight_mutex ), boost::alignment_of< lightweight_mutex >::value > fbm;

        static lightweight_mutex * pm = new( &fbm ) lightweight_mutex;

        return *pm;

    }

 

    static lightweight_mutex * mutex_init;

 

#endif

 

    static block * free;

    static block * page;

    static unsigned last;

 

    static inline void * alloc()

    {

#ifdef BOOST_HAS_THREADS

        lightweight_mutex::scoped_lock lock( mutex() );

#endif

        if(block * x = free)

        {

            free = x->next;

            return x;

        }

        else

        {

            if(last == items_per_page)

            {

                // "Listen to me carefully: there is no memory leak"

                // -- Scott Meyers, Eff C++ 2nd Ed Item 10

                page = ::new block[items_per_page];

                last = 0;

            }

 

            return &page[last++];

        }

    }

 

    static inline void * alloc(std::size_t n)

    {

        if(n != size) // class-specific new called for a derived object

        {

            return ::operator new(n);

        }

        else

        {

#ifdef BOOST_HAS_THREADS

            lightweight_mutex::scoped_lock lock( mutex() );

#endif

            if(block * x = free)

            {

                free = x->next;

                return x;

            }

            else

            {

                if(last == items_per_page)

                {

                    page = ::new block[items_per_page];

                    last = 0;

                }

 

                return &page[last++];

            }

        }

    }

 

    static inline void dealloc(void * pv)

    {

        if(pv != 0) // 18.4.1.1/13

        {

#ifdef BOOST_HAS_THREADS

            lightweight_mutex::scoped_lock lock( mutex() );

#endif

            block * pb = static_cast<block *>(pv);

            pb->next = free;

            free = pb;

        }

    }

 

    static inline void dealloc(void * pv, std::size_t n)

    {

        if(n != size) // class-specific delete called for a derived object

        {

            ::operator delete(pv);

        }

        else if(pv != 0) // 18.4.1.1/13

        {

#ifdef BOOST_HAS_THREADS

            lightweight_mutex::scoped_lock lock( mutex() );

#endif

            block * pb = static_cast<block *>(pv);

            pb->next = free;

            free = pb;

        }

    }

};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值