Вопрос на первый вгляд выглядит тривиальным, но почему-то есть некоторые опасения, например GPT сказал, что могут быть проблемы с алиасингом.
Решил написать cache oblivious d-кучу. Если индексировать элементы кучи с 0, а не с 1, то формула для обращения к child'ам/parent'ам становится некрасивая, поэтому решил сделать индексацию [1, N]. При этом куча такая, что
все дети одного родителя находятся на одной кеш линиии.
Примерный код:
Entry * arr = allocator.allocate(N, std::max(alignof(Entry), CACHE_LINE_SIZE));
--arr;
for(size_t i = 1; i <= N; ++i) arr[i]; // do something
При этом, например, выделить на 1 элемент больше и сделать то же самое, но без --arr; не получается, потому что тогда arr[1]...arr[d] (и вообще инвариант с выравниванием детей отвалится) не будут выровнены по кеш линии
В общем gpt слегка напугал с алиасингом, хотя так и не объяснил почему именно он нарушается при таком подходе
Ну и вариант с расширением апи аллокатора, где он будет возвращать такой адрес, что: (addr + sizeof(Entry)) % CACHE_LINE_SIZE == 0 тоже не подходит :)