В чем разница между выделением памяти через new и allocator

В чем разница между распределением памяти через new/malloc а также allocator?

Зачем нам нужен отдельный распределитель памяти для вектора, если у нас есть опции new а также malloc?

5

Решение

Когда вы используете new или malloc, управление памятью жестко связано с соответствующими функциями во время выполнения вашего компилятора. Напротив, когда используется распределитель, управление памятью делегируется распределителю, который является сменным. Это позволяет изменять используемые функции управления памятью.

Есть несколько веских причин для этого дополнительного уровня абстракции и контроля. Например, см .:
Убедительные примеры пользовательских C ++ STL-распределителей?.

2

Другие решения

Эх, я думаю, что new а также malloc разные и allocator предоставляет разные функции. malloc возвращает неинициализированные данные и calloc возвращается нуль-под ред. Но new вызовет конструктор, если вы создаете экземпляр некоторого класса (не int, bool эти примитивный типы, которые, кстати, тоже можно инициализировать). delete назвал бы деструктор, в то время как free не делает.

Что касается allocator, он обеспечивает уровень абстракции для пользователя. allocator может вернуть созданный объект, неинициализированное пространство памяти, или уничтожить объект, или освободить пространство. Использование контейнеров STL allocator чтобы получить пространство памяти и создать объект.

Но учтите, что как обычно allocator возможно, allocator не обязательно управлять памятью как new/delete, Это может создать большой кусок памяти, а затем сделать некоторые кеш распределения. Он может возвращать адрес памяти в областях, сопоставленных с файлами на диске, так что внутренние данные поступают в файловую систему по мере ее изменения верхним уровнем, контейнер. Также это может позвонить new чтобы получить память. В этом случае, allocator позволяет пользователю создавать контейнеры, которые лежат в определенных областях памяти. Итак, с allocators, внутренняя логика контейнеров отделена от способа управления памятью.

На самом деле вы можете написать класс, производный от std::allocator реализовать каждую функцию, упомянутую выше.


вы можете прочитать этот для более подробного обсуждения allocators.

1

в allocator класс есть allocate() который принимает два параметра следующим образом:

pointer allocate (size_type n, allocator<void>::const_pointer hint=0);

По ссылке of allocate () Параметр подсказки можно использовать для повышения производительности, упомянув, что вам нужно выделить новый блок памяти рядом с указанным. Поэтому я полагаю, используя подсказку, вы можете назначить блоки так, чтобы они были последовательными, как в случае с массивом.

0

Распределитель — это менеджер памяти. Контейнеры STL, например, предоставляют распределители по умолчанию, но их можно настроить, как описано в этой статье (учебное пособие для распределителей STL): http://www.codeguru.com/cpp/cpp/cpp_mfc/stl/article.php/c4079/Allocators-STL.htm.

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector