Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

Class template pool

Boost , Boost.Pool , Header <boost/pool/poolfwd.hpp>

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

PrevUpHomeNext

Class template pool

boost::pool — A fast memory allocator that guarantees proper alignment of all allocated chunks.

Synopsis

// In header: <boost/pool/poolfwd.hpp>
template<typename UserAllocator = default_user_allocator_new_delete> 
class pool :
  protected boost::simple_segregated_storage< UserAllocator::size_type >
{
public:
  // construct/copy/destruct
  explicit pool(const size_type, const size_type = 32, const size_type = 0);
  ~pool();
  // private member functions
  void * malloc_need_resize();
  void * ordered_malloc_need_resize();
  // protected member functions
  simple_segregated_storage< size_type > & store();
  const simple_segregated_storage< size_type > & store() const;
  details::PODptr< size_type > find_POD(void *const) const;
  size_type alloc_size() const;
  // protected static functions
  static bool is_from(void *const, char *const, const size_type);
  static void *& nextof(void *const);
  // public member functions
  bool release_memory();
  bool purge_memory();
  size_type get_next_size() const;
  void set_next_size(const size_type);
  size_type get_max_size() const;
  void set_max_size(const size_type);
  size_type get_requested_size() const;
  void * malloc();
  void * ordered_malloc();
  void * ordered_malloc(size_type);
  void free(void *const);
  void ordered_free(void *const);
  void free(void *const, const size_type);
  void ordered_free(void *const, const size_type);
  bool is_from(void *const) const;
};

Description

Всякий раз, когда объекту пула типов требуется память из системы, он запрашивает ее из своего параметра шаблона UserAllocator. Запрашиваемое количество определяется с помощью алгоритма удвоения, то есть каждый раз, когда выделяется больше системной памяти, количество запрашиваемой системной памяти удваивается.

Пользователи могут управлять алгоритмом удвоения, используя следующие расширения:

Пользователи могут передать дополнительный параметр конструктора для пула. Этот параметр относится к типу size_type и является числом фрагментов, которые необходимо запросить у системы, когда объекту необходимо выделить системную память. По умолчанию 32. Этот параметр может быть не 0.

Пользователи также могут передать дополнительный третий параметр конструктору пула. Этот параметр имеет тип size_type и устанавливает максимальный размер для выделенных кусков. Когда этот параметр принимает значение по умолчанию 0, то нет верхнего предела размера куска.

Наконец, если алгоритм удвоения не приводит к выделению памяти, пул будет отступать только один раз, уменьшая вдвое размер куска и пытаясь снова.

Тип UserAllocator— метод, который Бассейн будет использовать для выделения памяти из системы.

По сути, существует два способа использования пула классов: клиент может вызывать malloc() и free() для выделения и освобождения отдельных кусков памяти, это наиболее эффективный способ использования пула, но не позволяет эффективно распределять массивы кусков. В качестве альтернативы, клиент может позвонить orderd_malloc() и orderd_free(), в этом случае свободный список поддерживается в упорядоченном состоянии, и возможно эффективное распределение массивов кусков. Однако этот последний вариант может пострадать от плохой работы, когда выполняется большое количество ассигнований.

pool public construct/copy/destruct

  1. [[] [][] [] [] [] [] [] [] [] [] [] [] [] [] [] []] [] [] []] [[] [[]] [[] [[]] [[]] [[]] [[]] [[]] [[]] [[]] [[]] [[] [[[]]] [[[]]] [[[]]] [[[]]] [[[]]] [[[]]размер_типnrequested_size,constразмер_типnnext_size=32,constразмер_типnmax_size=0];

    Конструирует новый пустой Бассейн, который можно использовать для выделения кусков размера Запрашиваемый Размер.

    Параметры:

    nmax_size

    — максимальное количество кусков, выделяемых в одном блоке.

    nnext_size

    параметр имеет тип size_type, является числом кусков для запроса от системы в первый раз, когда объекту необходимо выделить системную память. По умолчанию 32. Этот параметр не может быть 0.

    nrequested_size

    Запрашиваемый размер куска

  • ~пул;

    Разрушает Бассейн, освобождая его список блоков памяти.

  • pool private member functions

    1. void*malloc_need_resize;

      Ни в одном из наших хранилищ нет памяти; создайте новое хранилище, выделив кусок в новом размере после моллока.

      Возвращается:

      0, если вне памяти. Называется, если malloc/ordered_malloc необходимо изменить размер бесплатного списка.

      указатель на кусочек.

    2. void*ordered_malloc_need_resize;
      Звонили, если Маллоку нужно изменить размер бесплатного списка.

      Никакой памяти в любом из наших хранилищ; сделайте новое хранилище

      Возврат:

      указатель на новый кусок.

    pool protected member functions

    1. simple_segregated_storage<size_type>&store;

      указатель для хранения.

    2. constsimple_segregated_storage<size_type>&storeconst;

      указатель для хранения.

  • подробности::PODptr<size_type>find_PODvoid*constchunk]const;
    находит, из чего был выделен POD в списке 'chunk'.

    найдите, из какой памяти PODptr состоит этот кусок.

    Возвращается:

    PODptr, который удерживает этот кусок.

  • size_typealloc_sizeconst;

    Расчетный размер кусков памяти, которые будут выделены этим Бассейном.

    Возврат:

    выделенный размер.

  • pool protected static functions

    1. статическийбоолявляется_отпустота*консткусочек,чарконстi,констконстразмер_типразмер_i;
      размер_i;[

      Возврат ложный, если кусок был выделен из какого-либо другого пула, или может быть возвращен в результате будущего распределения из какого-либо другого пула. В противном случае обратная стоимость бессмысленна.

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

      Параметры:

      кусок, чтобы проверить, является ли он из этого пула.

      кусок памяти при i с размером элемента i.

      размер элемента i

      размер элемента (размер площади участка этого блока, а не общий размер этого блока).

      Возврат:

      верно, если кусок был выделен или может быть возвращен. в результате будущего распределения.

    2. статическийпустота&следующийпустотаконстptr;

      Возвращение:

      Пойнтер отошел от дел. (Предоставляется и используется для удобства чтения кода :)

    pool public member functions

    1. boolrelease_memory;

      пул должен быть заказан. Освободите каждый блок памяти, который не имеет выделенных кусков.

      Возвращение:

      истинно, если по меньшей мере один блок памяти был освобожден.

    2. boolpurge_memory;

      пул должен быть заказан. Освободите каждый блок памяти.

      Эта функция отменяет любые указатели, ранее возвращенные функциями распределения t.

      Возврат:

      верно, если был освобожден по меньшей мере один блок памяти.

    3. size_typeget_next_sizeconst;

      Число фрагментов для запроса от системы в следующий раз, когда объекту необходимо выделить системную память. Это значение никогда не должно быть 0.

      следующего размера;

      Возврат:

    4. voidset_next_sizeconstsize_typennext_size;

      Установите количество фрагментов для запроса от системы в следующий раз, когда объекту необходимо выделить системную память. Это значение никогда не должно устанавливаться на 0.

      Возврат:

      nnext_size.

    5. size_typeget_max_sizeconst;

      max_size.

    6. voidset_max_sizeconstsize_typenmax_size;

      Установите max_size.

    7. size_typeget_requested_sizeconst;

      Возврат:

      запрашиваемый размер передан конструктору. (Это значение не изменится при жизни объекта бассейна.)

    8. void*malloc;

      Выделяет часть памяти. Поиск в списке блоков памяти для блока, который имеет свободный кусок, и возвращает этот свободный кусок, если он найден. В противном случае, создает новый блок памяти, добавляет свой бесплатный список в бесплатный список пула,

      Возвращает:

      свободный кусок от этого блока. Если новый блок памяти не может быть выделен, возвращается 0. Amortized O(1).

    9. void*заказал_malloc;

      Как и Маллок, только сливает свободные списки, чтобы сохранить порядок. Амортизированный O(1).

      Возвращает:

      свободный кусок от этого блока. Если новый блок памяти не может быть выделен, возвращается 0. Amortized O(1).

    10. void*ordered_mallocsize_typen;

      Получает адрес кусочка n, выделяя новую память, если она еще не доступна.

      Возвращение:

      Адрес куска n при выделении ок.

      0, если недостаточно памяти для n кусков.

    11. voidfreevoid*constchunk;

      Как и malloc, выделяет достаточное количество смежных кусков для покрытия байтов n * запрашиваемого размера. Amortized O(n).

      Выделяет часть памяти. Обратите внимание, что кусочек не может быть 0. O(1).

      Чанк должен быть ранее возвращен t.malloc() или t.ordered_malloc(). Допустим, что chunk на самом деле относится к блоку кусков, охватывающих байты n * partition_sz. Располагает каждый кусок в этом блоке. Обратите внимание, что кусочек может не быть 0.

      Возвращает:

      свободный кусок от этого блока. Если новый блок памяти не может быть выделен, возвращается 0. Amortized O(1).

    12. voidorder_freevoid*constchunk;

      То же самое, что и выше, но с сохранением порядка.

      Обратите внимание, что кусочек не может быть 0. O(N) относительно размера бесплатного списка. Кусок должен быть ранее возвращен t.malloc() или t.ordered_malloc().

    13. voidfreevoid*constchunks,constsize_typen;

      Предполагает, что chunk фактически относится к блоку chunks.

      кусочек должен был быть ранее возвращен t.ordered_malloc(n), охватывающим n* partition_sz байты. Выделите каждый кусок в этом блоке. Обратите внимание, что кусочек может не быть 0. O(n).

    14. voidorderd_freevoid*constchunks,constsize_typen];

      Предполагает, что chunk фактически относится к блоку из кусков, охватывающих n * partition_sz байтов; распределяет каждый кусок в этом блоке.

      Обратите внимание, что кусочек может не быть 0. Сохранение порядка. O(N + n) где N - размер свободного списка. Кусок должен быть ранее возвращен t.malloc() или t.ordered_malloc().

    15. boolis_fromvoid*constchunkconst;

      Возвращение:

      Возвращается истинно, если кусок был выделен из u или может быть возвращен в результате будущего распределения из u. Возврат ложный, если кусок был выделен из какого-либо другого пула или может быть возвращен в результате будущего распределения из какого-либо другого пула. В противном случае обратная стоимость бессмысленна. Обратите внимание, что эта функция не может использоваться для надежного тестирования случайных значений указателей.


    PrevUpHomeNext

    Статья Class template pool раздела Boost.Pool Header <boost/pool/poolfwd.hpp> может быть полезна для разработчиков на c++ и boost.




    Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



    :: Главная :: Header <boost/pool/poolfwd.hpp> ::


    реклама


    ©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
    Top.Mail.Ru

    Время компиляции файла: 2024-08-30 11:47:00
    2025-05-20 06:56:05/0.011102914810181/1