В чем разница между распределением памяти через new
/malloc
а также allocator
?
Зачем нам нужен отдельный распределитель памяти для вектора, если у нас есть опции new
а также malloc
?
Когда вы используете new или malloc, управление памятью жестко связано с соответствующими функциями во время выполнения вашего компилятора. Напротив, когда используется распределитель, управление памятью делегируется распределителю, который является сменным. Это позволяет изменять используемые функции управления памятью.
Есть несколько веских причин для этого дополнительного уровня абстракции и контроля. Например, см .:
Убедительные примеры пользовательских C ++ STL-распределителей?.
Эх, я думаю, что new
а также malloc
разные и allocator
предоставляет разные функции. malloc
возвращает неинициализированные данные и calloc
возвращается нуль-под ред. Но new
вызовет конструктор, если вы создаете экземпляр некоторого класса (не int
, bool
эти примитивный типы, которые, кстати, тоже можно инициализировать). delete
назвал бы деструктор, в то время как free
не делает.
Что касается allocator
, он обеспечивает уровень абстракции для пользователя. allocator
может вернуть созданный объект, неинициализированное пространство памяти, или уничтожить объект, или освободить пространство. Использование контейнеров STL allocator
чтобы получить пространство памяти и создать объект.
Но учтите, что как обычно allocator
возможно, allocator
не обязательно управлять памятью как new
/delete
, Это может создать большой кусок памяти, а затем сделать некоторые кеш распределения. Он может возвращать адрес памяти в областях, сопоставленных с файлами на диске, так что внутренние данные поступают в файловую систему по мере ее изменения верхним уровнем, контейнер. Также это может позвонить new
чтобы получить память. В этом случае, allocator
позволяет пользователю создавать контейнеры, которые лежат в определенных областях памяти. Итак, с allocator
s, внутренняя логика контейнеров отделена от способа управления памятью.
На самом деле вы можете написать класс, производный от std::allocator
реализовать каждую функцию, упомянутую выше.
вы можете прочитать этот для более подробного обсуждения allocator
s.
в allocator
класс есть allocate()
который принимает два параметра следующим образом:
pointer allocate (size_type n, allocator<void>::const_pointer hint=0);
По ссылке of allocate () Параметр подсказки можно использовать для повышения производительности, упомянув, что вам нужно выделить новый блок памяти рядом с указанным. Поэтому я полагаю, используя подсказку, вы можете назначить блоки так, чтобы они были последовательными, как в случае с массивом.
Распределитель — это менеджер памяти. Контейнеры STL, например, предоставляют распределители по умолчанию, но их можно настроить, как описано в этой статье (учебное пособие для распределителей STL): http://www.codeguru.com/cpp/cpp/cpp_mfc/stl/article.php/c4079/Allocators-STL.htm.