Как я могу выделить несколько массивов разных типов в одном распределении?C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Как я могу выделить несколько массивов разных типов в одном распределении?

Сообщение Anonymous »

Я пишу проверочный хеш-набор, который внутри поддерживает массив слотов, а также отдельный массив метаданных слотов:
< pre class="lang-cpp Prettyprint-override">

Код: Выделить всё

template 
class HashSet {
T *slots;              // Array of slots
uint8_t *metadata;     // Array of metadata (each slot has a single byte of metadata)
Allocator allocator;
/* ... */
}
Теперь, в моей текущей реализации, массивы слотов и метаданных используют отдельные выделения. В частности, я использую placement new/delete для слотов (через std::allocator_traits), чтобы избежать ненужного вызова конструктора T по умолчанию. Однако для метаданных я просто использовал обычный new[]/delete[], поскольку метаданные в любом случае всегда необходимо инициализировать в начале. Таким образом, мой код выглядит следующим образом (на примере моей резервной функции):

Код: Выделить всё

// Inside `class HashSet`
void reserve(size_t new_capacity) {
if (curr_capacity >= new_capacity) return;

// Allocate new slots and metadata arrays separately
auto new_slots = std::allocator_traits::allocate(allocator, new_capacity);
auto new_metadata = new uint8_t[new_capacity];

/* Rehash all elements, and move them to `new_slots`... */

// Deallocate the old `slots` and `metadata` arrays
if (slots) std::allocator_traits::deallocate(allocator, slots, curr_capacity);
delete[] metadata;

/* Set `slots` and `metadata` to `new_slots` and `new_metadata`, and update `curr_capacity`... */
}
Теперь я понял, что размещение обоих массивов в едином распределении улучшит локальность ссылки. Однако я не уверен, как это сделать. В частности, я почти уверен, что простое выделение большого буфера char* и обработка его как массива элементов, объединенного с массивом метаданных, нарушит правила выравнивания памяти. В то же время меня беспокоит тот факт, что я использую разные стратегии управления слотами и метаданными (размещение нового/удаления против обычного нового/удаления); Я подумывал просто использовать для всего размещения новое/удаление.
В целом мой вопрос: Как я могу создать два массива разного типа в одном непрерывном выделении > в целях улучшения локальности кэша?
Единственное, что я знаю, похожее на это, это тот факт, что std::make_shared также выделяет оба значения в качестве счетчика ссылок в одном распределение. Однако я не знаю, как этого добиться.

Подробнее здесь: https://stackoverflow.com/questions/792 ... allocation
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Как я могу выделить несколько массивов разных типов в одном распределении?
    Anonymous » » в форуме C++
    0 Ответы
    11 Просмотры
    Последнее сообщение Anonymous
  • Как выделить два объекта разных типов в одном блоке памяти?
    Anonymous » » в форуме C++
    0 Ответы
    3 Просмотры
    Последнее сообщение Anonymous
  • Как выделить два объекта разных типов в одном блоке памяти?
    Anonymous » » в форуме C++
    0 Ответы
    2 Просмотры
    Последнее сообщение Anonymous
  • Подсказки типов и проверка типов для пользовательских типов IntEnum
    Anonymous » » в форуме Python
    0 Ответы
    69 Просмотры
    Последнее сообщение Anonymous
  • Подсказки типов и проверка типов для пользовательских типов IntEnum
    Anonymous » » в форуме Python
    0 Ответы
    36 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C++»