1000 байт выделенной памяти, распределенной вокруг моей памяти
Нет, у вас есть один массив из 1000 записей (некоторого размера, который почти наверняка больше, чем 1 байт на запись).
Если каждая запись достаточно велика, чтобы обрабатывать регистр без столкновения, дополнительное динамическое распределение c не требуется, пока не произойдет столкновение. (например, возможно, вы используете объединение и 1-битный флаг, чтобы указать, является ли эта запись автономным сегментом или указателем на связанный список.)
Если нет, тогда , когда вы напишите запись , для нее должно быть выделено место и указатель хранится в самом массиве таблиц. (например, ключ-значение ha sh таблица с маленькими ключами, но большими значениями). Пустая таблица ha sh все еще может быть заполнена указателями NULL.
Возможно, вы захотите, чтобы она содержала структуры указателя и значение ha sh (для одноэлементных сегментов). Затем вы можете отклонить запросы, которые явно отсутствуют, без другого уровня косвенности, если полное значение ha sh не соответствует запросу; например, для 32 или 64-битного га sh это намного больше битов, чем 10 бит для индексации таблицы с 1024 записями.
Чтобы уменьшить общую фрагментацию, вы можете использовать распределитель slab или другое Техника для вырезания узлов из смежного блока, который вы получаете из глобального распределителя. Наличие в таблице ha sh собственного частного списка свободных номеров может помочь в пространственной локализации узлов связанного списка, поэтому они, по крайней мере, не разбросаны по множеству различных виртуальных страниц (пропуски TLB) и, возможно, не страницы DRAM (даже более медленный кэш пропускает)