Я хотел бы создать свой собственный класс распределителя, и мне интересно несколько вещей:Вопросы о пользовательских распределители
Я должен определить следующие типы:
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)
Спасибо. :)
Вы можете использовать любой тип, который вам нравится, это ваш код в конце концов. Но почему бы не использовать стандартный тип, который предназначен для использования для размера или разницы? И помните, что разница может быть отрицательной, поэтому вы не можете использовать для нее неподписанный тип данных. Также помните, что если вы хотите использовать свои классы вместе со стандартной библиотекой, вам потребуются особые требования, которые могут ограничивать ваш выбор типа. –
То, что я хотел бы знать, это не то, если мне разрешено это делать, но если это можно сделать безопасно. – Virus721
С 'uint32_t' на месте вы не можете выделить больше чем' 4096 * sizeof (Object) 'МБ памяти с этим распределителем через интерфейс признаков, поскольку' allocator_traits :: allocate' использует 'size_type' вашего распределителя в качестве аргумента, даже если ваш выделить нет. – Pixelchemist