2

1, у меня уже есть быстрый аллокатора так:Как перегрузить оператор new для реализации быстрого распределителя для класса?

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

2, у меня тоже есть класс А, который необходим для динамически распределяемых/удаляются быстро. Так что я думаю, что перегрузки operator new и operator delete внутри определения КЛАССА А как это:

struct A 
{ 
    int buf[1024]; 

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

3, потому что operator new и operator delete являются статическими методами, таким образом, я не могу получить доступ к this указателю.

4, Мой вопрос: Как я должен инициализировать экземпляр FastAllocator «s, которые могут быть доступны с помощью operator new и operator delete?

ответ

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

Затем new и delete перегрузки могут позвонить в обертку.

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); } 
}; 
Смежные вопросы