如何重载运算符new来实现类的快速分配器

How to overload operator new to implement a fast allocator for a class?

本文关键字:实现 分配器 new 何重载 重载 运算符      更新时间:2023-10-16

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,我的问题是:我应该如何初始化operator newoperator delete可以访问的FastAllocator的实例

您可以为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); }
};