Начальный размер блока для пула памяти

Я реализую класс пула памяти, используя шаблон C ++, и мне интересно, какой хороший размер может быть для блока. Например:

template <typename T>
class Mempool {

unsigned char* block;

// constructor.
Mempool() {
block = malloc(sizeof(T)*DEFAULT_N)
}

};

В приведенном выше примере размер блока на самом деле зависит от типа T и значение по умолчанию числа элементов, которые будут созданы. Какова лучшая (или распространенная) практика для этого? Должен ли я рассмотреть выравнивание памяти для размера блока здесь?

0

Решение

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

центровка:
Я предполагаю, что пул должен удостовериться, что объекты в нем правильно выровнены. Это означает, что вы можете разместить объекты в местах памяти, которые по крайней мере кратны std::alignment_of<T>::value или же alignof(T),

Кэш-дружелюбиеПул также может округлять местоположения объектов до кратных размеров строк кэша, поэтому (маленькие) объекты никогда не будут размещаться в двух строках кэша, но всегда будут располагаться в одной.

набивка: Если объекты очень маленькие (всего несколько байтов), но у вас их очень много, то любое дополнительное заполнение может значительно увеличить требования к памяти, и от приложения зависит, будет ли это проблемой или нет. Слишком большое заполнение может на самом деле снизить производительность, когда объекты не находятся близко друг к другу, и существует много ошибок в кэше.

Основное управление памятьюИ, наконец, хорошо Размер блока также может зависеть от базового хранилища. Возможно, вы захотите, чтобы ваши размеры размещения соответствовали размерам страниц ОС, или используйте их кратно. Кроме того, если malloc это дорого, тогда вы, вероятно, захотите вызывать его как можно меньше раз, чтобы избежать издержек и конфликтов системного вызова. В средах, где malloc дешевле, может быть нормально использовать меньшие начальные размеры блоков и malloc хотя чаще malloc все еще будет немного накладные расходы. Многое из этого зависит от ОС.

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

Наконец, есть готовые к использованию malloc-замены, такие как tcmalloc, jemalloc, которые могут иметь совершенно другие характеристики, чем у вашей ОС malloc, Поэтому хорошим вариантом является проверка одного из них, а не использование собственного распределителя.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]