< 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;
/* ... */
}
Код: Выделить всё
// 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`... */
}
В целом мой вопрос: Как я могу создать два массива разного типа в одном непрерывном выделении > в целях улучшения локальности кэша?
Единственное, что я знаю, похожее на это, это тот факт, что std::make_shared также выделяет оба значения в качестве счетчика ссылок в одном распределение. Однако я не знаю, как этого добиться.
Подробнее здесь: https://stackoverflow.com/questions/792 ... allocation