如何重载operator new来为类实现快速分配器?

时间:2013-08-27 01:52:23

标签: c++ performance memory-management overloading static-methods

1,我已经有了这样的快速分配器:

struct FastAllocator
{
    FastAllocator(size_t fixed_size);
    void* Allocate(size_t size);
    void  Free(void* ptr);
};

2,我还有一个需要动态分配/删除的A类。所以我想到在类A的定义中重载operator newoperator delete是这样的:

struct A
{
    int buf[1024];

    void* operator new(size_t size);
    void  operator delete(void* ptr);
};

3,因为operator newoperator delete都是静态方法,因此我无法访问this指针。

4,我的问题是:我应该如何初始化FastAllocatoroperator new可以访问的operator delete个实例?

1 个答案:

答案 0 :(得分:3)

您可以为FastAllocator创建一个可识别类型的包装器。

template <typename T>
class FastAllocatorByType {
    static FastAllocator & fa () {
        static FastAllocator fastalloc(sizeof(T));
        return fastalloc;
    }
public:
    static void* Allocate(size_t size) { return fa().Allocate(size); }
    static void  Free(void* ptr) { fa().Free(ptr); }
};

然后,newdelete重载可以调用包装器。

struct A
{
    typedef FastAllocatorByType<A> FastAlloc;

    int buf[1024];

    void* operator new(size_t size) { return FastAlloc::Allocate(size); }
    void  operator delete(void* ptr) { FastAlloc::Free(ptr); }
};