2015-06-11 2 views
3

Я хотел бы создать свой собственный класс распределителя, и мне интересно несколько вещей:Вопросы о пользовательских распределители

  • Я должен определить следующие типы: typedef size_t size_type; и typedef ptrdiff_t difference_type;. Могу ли я использовать что-то отличное от size_t? Если я хочу использовать контейнер STL в классе, который использует uint32_t для длин и позиций вместо size_t, могу ли я использовать uint32_t, или это должно быть size_t? Может ли он создавать переполнения или другие неприятные вещи, если я использую другой тип или даже подписанный тип?

  • Как передать параметр в распределитель? Должен ли я добавить конструктор с параметром к нему и создать его вручную, прежде чем передавать его в конструктор контейнера STL, чтобы использовать его?

Для функции deallocate, определенной ниже, могу ли я просто игнорировать количество элементов для освобождения?

void deallocate(pointer p, size_type nNum) 
{ 
    (void) nNum; 
    delete[] p; 
} 
  • Что такое "перекомпоновка" материал все?

..

template< class U > 
struct rebind 
{ 
    typedef Allocator<U> other; 
}; 

template< class U > 
Allocator(const Allocator<U> & oAlloc) 

Спасибо. :)

+1

Вы можете использовать любой тип, который вам нравится, это ваш код в конце концов. Но почему бы не использовать стандартный тип, который предназначен для использования для размера или разницы? И помните, что разница может быть отрицательной, поэтому вы не можете использовать для нее неподписанный тип данных. Также помните, что если вы хотите использовать свои классы вместе со стандартной библиотекой, вам потребуются особые требования, которые могут ограничивать ваш выбор типа. –

+0

То, что я хотел бы знать, это не то, если мне разрешено это делать, но если это можно сделать безопасно. – Virus721

+0

С 'uint32_t' на месте вы не можете выделить больше чем' 4096 * sizeof (Object) 'МБ памяти с этим распределителем через интерфейс признаков, поскольку' allocator_traits :: allocate' использует 'size_type' вашего распределителя в качестве аргумента, даже если ваш выделить нет. – Pixelchemist

ответ

2
  1. Это ваш распределитель, поэтому вы можете использовать тот тип, который вам нужен. Но обратите внимание, что если вы планируете использовать его с контейнерами STL, вам придется использовать тип, который ожидают контейнеры STL. size_t кажется уместным здесь.

  2. Вы можете предоставить параметры распределителю, как если бы это был обычный класс. Конструкторы, методы инициализации или сеттеры в порядке. Фактически, вы можете предоставить все функции, которые вы хотите использовать для распределителя, но вы должны уважать выделение, освобождать подпись.

  3. Вы можете игнорировать размер функции deallocate. Я видел много стандартных реализаций распределителей, которые не использовали этот параметр. Иногда эта информация может быть полезна, например, если ваш распределитель переключается на разные стратегии распределения в зависимости от размера, этот параметр может быть полезен в методе deallocate для включения эффективной реализации deallocate.

Смежные вопросы