Как узнать родительский блок элемента в распределителе памяти - PullRequest
0 голосов
/ 01 февраля 2020

Я разрабатываю специальный распределитель памяти, который управляет пулом больших блоков, каждый из которых содержит фиксированное количество элементов.

using T = ItemType;

struct Block {
  char data[M*sizeof(T)];  // M is tunable, power of two or else
  int i {0};
  Freelist freelist;
  // ... other data field
}

// Pool collects a number of pooled blocks
struct Pool {
  std::list<Block> blocks;  
  // other data field
}

allocate выделит один элемент неинициализированной памяти из доступного блока. Из-за приложения мой allocate должен обрабатывать один элемент за раз. Размер в байтах элемента равен sizeof(T).

T* allocate() {
  Block b* = pool.get_one_block();
  int idx = b->get_free_index();
  return reinterpret_cast<T*>(b->data) + idx;
}

. deallocate принимает указатель элемента ptr и пересылает его в распределитель. Перед любой внутренней обработкой нам нужно знать block элемента. Как мне сделать это, не прося T добавить дополнительный спутниковый указатель на его исходный блок?

void deallocate(T* ptr) {
  Block* b = how_to_get_the_block_of_ptr();  // <-- is there any faster way to do so?
  b->add_free_list(ptr);
  // other internal processing
}

Я слышал, что есть несколько побитовых трюков вместе с выравниванием выделения памяти для получения блок указателя при проектировании распределителя памяти. Нужна помощь.

...