Как включить распределитель памяти в C ++ - PullRequest
2 голосов
/ 26 марта 2011

Я работаю над структурой данных без блокировки и проверяю код на libcds , но я не могу понять, как включить там распределитель памяти в мой файл класса.

template<class KEY, class VALUE>
class DataStruc{
public:

Раньше я никогда не использовал настраиваемые распределители памяти, и у меня возникают проблемы с поиском способа его включения.

Ответы [ 2 ]

4 голосов
/ 26 марта 2011

Вам просто нужно реализовать оператор new () для вашего класса.Ваша реализация должна получить память от экземпляра распределителя.

В заголовочном файле для вашего класса вам нужно объявить операторы выделения / освобождения:

public:
    void * operator new(size_t size);
    void * operator delete(void * obj, size_t size);
    void * operator new[](size_t size);
    void * operator delete[](void * obj, size_t size);

Тогда вам нужнореализовать их.Где-то вам нужно создать экземпляр распределителя;возможно просто сделайте это статическим в файле, где вы реализуете эти операторы.Затем, просто взглянув на документы API на этом веб-сайте, вы сделаете что-то вроде ниже.Я вставил утверждения, потому что не вижу, как передать размер объекта этому распределителю;это фактически означает, что YourClass лучше не служить родителем для других классов.

static cds::details::Allocator<YourClass> allocator;

void * YourClass::operator new(size_t size) { 
    assert size == sizeof(YourClass);
    return allocator.New();
}

void * YourClass::operator new[](size_t size) { 
    return allocator.NewArray(size/sizeof(YourClass));
}

void YourClass::operator delete(void * object, size_t size) { 
    return allocator.Delete(object);
}

void YourClass::operator delete[](void * object, size_t size) { 
    return allocator.DeleteArray(object, size/sizeof(YourClass));
}

Я не слишком доволен утверждениями и делениями, но уже поздно и я устал.Может быть, кто-то еще знает более элегантный способ сделать эти API-интерфейсы немного лучше.Но это сработает.

0 голосов
/ 26 марта 2011

Прочтите этот пост о том, как реализовать собственную систему выделения памяти: http://www.stevestreeting.com/2008/06/28/memory-man/

Его пост относится к пользовательской системе выделения памяти, реализованной в графической библиотеке Ogre3D с открытым исходным кодом. Вы можете скачать его исходный код и посмотреть, как это делается на http://www.ogre3d.org/download/source

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...