Анимация
JavaScript
|
Главная Библионтека механизмы распределения памяти (с помощью операторов ::operator new и : :operator delete) часто оптимизируются для работы с большими объектами, а не маленькими. Это делает стандартный механизм распределения памяти непригодным для работы с небольщими объектами, поскольку он медленно работает и неэффективно использует память. Для решения этой проблемы необходимо создать специальные механизмы распределения памяти для небольших объектов, настроенные на работу с маленькими блоками пам5гги (от десятков до сотен байтов). Эти механизмы объединяют элементарные блоки в более крупные участки (chunks), стремясь минимизировать накладные расходы памяти и времени. Система поддержки выполнения программ на языке С++ сама определяет размер освобождаемого блока. Эту информацию можно перехватить, просто применяя малоизвестную форму перегрузки оператора delete. Может ли механизм распределения памяти для небольших объектов, предусмотренный в библиотеке Loki, работать еще быстрее? Конечно, да. Этот механизм не выходит за пределы стандарта языка С++. Как показано выше, такие проблемы, как выравнивание блоков памяти, решаются традиционным способом, что приводит к снижению эффективности его работы. И все же этот механизм работает достаточно быстро, просто и надежно, что гарантирует его платформную независимость. 4.11. Краткое описание механизма распределения памяти для небольших объектов • Механизм, реализованный в библиотеке Loki, имеет четыре уровня. Первый уровень состоит из закрытого типа Chunk, предназначенного для организации памяти в виде участков (chunks), состоящих из блоков одинакового размера. На втором уровне архитектуры находится класс FixedAllocator, в котором используется вектор переменной длины, состоящий из участков памяти. Этот класс предназначен для выполнения запросов на выделение динамической памяти. На третьем уровне расположен класс SmallObjAllocator, использующий несколько объектов класса FixedAllocator. Это позволяет выделять память для объекта любого размера. Небольшие объекты размешаются в памяти с помошью объекта класса FixedAllocator, а запросы на выделение больших участков памяти переадресовываются стандартному оператору ::operator new. Последний, четвертый, уровень содержит шаблонный класс SmallObject, реализующий интерфейс объектов класса SmallObjAllocator. • Краткое описание шаблонного класса SmallObject выглядит так. template < template <class т> class ThreadingModel = default threading, std::size t chunksize = default chunk size, std::size t maxsmallobjectsize = max SMALL 0B3ECT size > class SmallObject { public: static void* operator new(std::si2e t size); static void operator delete(void* p, std::size t size); virtual -SmallObjectO функциональные возможности механизма распределения памяти для небольших объектов можно унаследовать от конкретизации класса SmallObject. Шаблонный класс SmallObject можно конкретизировать с параметрами, заданными по умолчанию (smallObjecto), настроить его модель потоков или задать параметры вьщеляемой памяти. Если в нескольких потоках объекты создаются с помощью оператора new, следует использовать многопоточную модель, задав параметр ThreadingModel. Информация об этой модели приведена в приложении. Значение константы default CHUNK SIZE по умолчанию равно 4096. Значение константы max small OBJECT SIZE по умолчанию равно 64. В директиве #define можно определить константы max small objeCT SIZE или DEFAULT CHUNK SIZE, или обе одновременно, заместив их значения, принятые по умолчанию. После расширения макрос распространяется на константы типа std: :size t (или совместимого типа). Если в директиве #define константы max SMALL OBJECT size или de-FAULT CHUNK SIZE определить равными нулю, то в заголовочном файле Smal 1 Obj . h будет применяться условная компиляция, которая просто использует стандартный механизм распределения памяти. Интерфейс остается прежним. Это полезно, если нужно сравнить работу профаммы со специализированным механизмом распределения памяти и без него. Часть II Компоненты 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 [ 34 ] 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 |