Boost.Pool: различия между версиями

Содержимое удалено Содержимое добавлено
http://www.boost.org/doc/libs/release/libs/pool/doc/html/index.html (ссылка на последнюю версию документации, было 1.48, а стало 1.57) и оформление
оформление и убрал дублирование информации (Интерфейсы Pool)
Строка 1:
Назначение учебника в популяризации применения [http://www.boost.org/ библиотеки Boost] вообще и [http://www.boost.org/doc/libs/release/libs/pool/doc/html/index.html Boost::Pool] в частности.
 
== Введение ==
 
=== Что такое Pool? ===
 
Boost.Pool представляет собой очень быстрый алгоритм выделения памяти, быстродействие которого достигается за счет ограничения области применения, т.е. потерей универсальности. Для более подробной информации об идеях, на которых базируется Pool, смотрите [[Boost.Pool#Идеи, лежащие в основе pool|Идеи, лежащие в основе Pool]] и [[Boost.Pool#Хранилище с простым разбиением (Simple Segregated Storage)|Хранилище с простым разбиением (Simple Segregated Storage)]]).
 
=== Зачем нужен Pool? ===
 
Применение Pools дает вам больше контроля над использованием памяти в вашей программе. Например, у вас может быть ситуация, когда вы выделяете несколько небольших объектов в одном месте и затем в определенный момент они вам становятся не нужны. Используя Pool, вы можете либо вызвать деструкторы всех этих объектов, либо просто удалить их из памяти; при этом Pool гарантирует отсутствие утечек памяти.
 
=== Когда нужен Pool? ===
 
Pools используется при частом создании и удалении небольших объектов. Другой вариант описан в предыдущем параграфе, когда необходимо одновременно удалить множество объектов из памяти.
В общем случае, используйте Pools когда вам нужен более эффективное (нестандартное) управление памятью.
 
=== Какой аллокатор лучше всего? ===
 
pool_allocator является наиболее универсальным решением, направленным на достижение эффективного выделения нескольких блоков памяти одновременно.
fast_pool_allocator представляет собой также универсальное решение, но направленное на достижение эффективного выделения одного блока памяти за раз; его можно применять и для выделения нескольких блоков одновременно, но он будет уступать в эффективности pool_allocator.
Строка 24 ⟶ 20 :
 
== Как пользоваться Pool? ==
 
Смотрите раздел [[Boost.Pool#Интерфейсные классы Boost Pool — Какие классы существуют и когда их использовать.|Интерфейсные классы Boost Pool]], который демонстрирует различные интерфейсы Pool, предоставляемые библиотекой.
 
Строка 36 ⟶ 31 :
 
== Установка ==
 
Библиотека Boost.Pool состоит только из заголовочных файлов. Это означает, что не нужно собирать какие-либо .lib, .dll, или .so файлы; просто добавьте директорию Boost в пути к заголовочным файлам вашего компилятора.
 
Строка 44 ⟶ 38 :
 
== Интерфейсные классы Boost Pool — Какие классы существуют и когда их использовать. ==
 
''Интерфейсные классы Pool''
* [[Boost.Pool#pool|pool]]
* [[Boost.Pool#Object_pool|Object_pool]]
* [[Boost.Pool#Singleton_pool|Singleton_pool]]
* [[Boost.Pool#pool_allocator|pool_allocator]]
 
=== Введение ===
Строка 55 ⟶ 43 :
 
=== Терминология и соглашения ===
 
==== ''Object'' или ''Singleton'' ====
Вы можете использовать Boost.Pool в виде Object или как Singleton. При использовании в виде ''Object'' вы каждый Pool создаете в виде отдельного индивидуального объекта, который может быть явно создан или уничтожен в любой удобный для вас момент. При этом уничтожение такого Pool неявно освобождает всю ранее выделенную память.<br />
Строка 379 ⟶ 368 :
 
=== Идеи, лежащие в основе pool ===
 
==== Динамическое выделение памяти ====
Динамическое выделение памяти является фундаментальной частью большинства компьютерных систем примерно с начала шестидесятых годов 20 века. [http://www.boost.org/doc/libs/1_48_0/libs/pool/doc/html/boost_pool/appendices/references.html#ref1%20%5B%201%20 1]<br />
Динамическое выделение памяти используют все. Если вы хоть раз вызывали malloc или new, значит вы тоже использовали динамическое выделение памяти. Большинство программистов склонны рассматривать кучу как абстрактный черный ящик: мы просим у нее память, и она как-то там (не важно как) создает ее для нас. Но иногда у нас возникают проблемы, потому что куча — вовсе не черный ящик и на самом деле иногда важно, откуда куча берет память.<br />
Строка 394 ⟶ 385 :
Хранилище с простым разделением (simple segregated storage) предназначено для решения этих двух моментов. Оно практически не приводит к перерасходу памяти и выделение памяти происходит за небольшое постоянное (усредненное) время. Тем не менее, это достигается путем потери универсальности; хранилище с простым разделением может выделять память блоками памяти одинакового размера.
 
==== Хранилище с простым разбиением (Simple Segregated Storage) ====
 
Хранилище с простым разбиением лежит в основе библиотеки Boost Pool. Хранилище с простым разбиением является простейшим и, возможно, быстрейшим, алгоритмом выделения и освобождения памяти и начинается с того, что вся имеющаяся (или вся выделенная под хранилище) память разбивается на блоки фиксированного размера. Откуда блоки не имеет принципиального значения (за исключением затрат на реализацию). Pool представляется собой объект, который использует Хранилище с простым разбиением таким образом. Проиллюстрируем: