Шрифт:
Материал, изложенный в этом совете, дает представление о том, чего не могут сделать распределители памяти, но вас, вероятно, больше интересует другой вопрос — что они могут? Это весьма обширная тема, которую я выделил в совет 11.
Совет 11. Учитывайте область применения пользовательских распределителей памяти
Итак, в результате хронометража, профилирования и всевозможных экспериментов вы пришли к выводу, что стандартный распределитель памяти STL (то есть
Предположим, у вас имеются специальные функции для управления блоком общей памяти, написанные по образцу
Требуется, чтобы память для содержимого контейнеров STL выделялась в общем блоке. Никаких проблем:
pointer allocate(size_type numObjects, const void* localityHint=0) {
return static_cast<pointer>(mal1ocShared(numObjects *szeof(T)));
}
void deallocate(pointer ptrToMemory, size_type numObjects) {
freeShared(ptrToMemory);
}
За информацией о типе pointer, а также о преобразовании типа и умножении при вызове allocate обращайтесь к совету 10. Пример использования
Обратите особое внимание на формулировку комментария рядом с определением
Надеюсь, смысл происходящего достаточно ясен из комментариев. В общих чертах происходит следующее: мы выделяем бок общей памяти и конструируем в ней
Несомненно, вы заметили: в приведенном фрагменте проигнорирована возможность того, что
Рассмотрим другой пример использования распределителей памяти. Предположим, у нас имеются две кучи, представленные классами
Далее предположим, что вы хотите разместить содержимое контейнеров STL в заданных кучах. Сначала следует написать распределитель, способный использовать классы