Как привязать пользовательский распределитель? - PullRequest
3 голосов
/ 07 января 2020

Мне нужен специальный распределитель для векторов и карт STL, чтобы он «выделял» память в предварительно выделенном блоке памяти. Я наткнулся на этот кусок кода, который есть почти в каждом распределителе.

    Allocator(const Allocator<U, growSize> &other)
    {
        if (!std::is_same<T, U>::value)
            rebindAllocator = new std::allocator<T>();
    }

Может кто-нибудь объяснить, что он делает и зачем нам нужен этот интерфейс? Большое спасибо заранее.

Полный исходный код

1 Ответ

1 голос
/ 07 января 2020

Думайте о распределителе как о типизированном интерфейсе, ссылающемся на некоторое базовое нетипизированное хранилище. Многие распределители могут ссылаться на одно и то же хранилище.

Распределители требуются для разрешения повторного связывания, чтобы распределитель для T можно было превратить в распределитель для U, ссылающегося на одно и то же хранилище. Распределители должны быть копируемыми, и копия распределителя должна ссылаться на то же хранилище. См. Cppreference.

Эта реализация распределителя также является хранилищем. Это происходит из пула памяти. Следовательно, для скопированного распределителя необходим способ выделения и освобождения из исходного хранилища, а не из его собственного. Это copyAllocator. По непонятным причинам он делает это только на Windows.

Аналогично, распределителю отскока требуется доступ к тому же хранилищу. Этот распределитель, кажется, нарушает это и использует std::allocator. Это означает, что он не подходит для многих случаев использования STL. std::map и другие основанные на узлах контейнеры будут выделяться с помощью распределителя отскока, что означает, что они не будут использовать пул памяти.

...