Как получить блоки с большим выравниванием?

Чтобы избежать поддержки сложных структур данных, я хочу выделять блоки с довольно большим выравниванием (скажем, несколько килобайт, возможно, мегабайт, всегда по степени двойки). Это позволяет мне замаскировать младшие биты указателя, чтобы легко получить адрес начала блока, на который он указывает.

Мне нужен метод, гарантирующий выделение такого блока с указанным выравниванием, например. для выделения блоков по 4096 байт с выравниванием по 4096 байт. Чтобы метод работал, выравнивание всегда будет соответствовать размеру блоков, поэтому ожидается, что потеря памяти станет проблемой в долгосрочной перспективе.

Я использую C ++ (так что методы C и C ++ подходят), и любое решение должно быть переносимым в обычные среды рабочего стола. Если не будет портативного решения, Linux будет иметь наивысший приоритет.

Мне известно о распределении памяти Win32 с большим выравниванием , но если есть общая библиотека C, которая делает это с помощью одного вызова функции, я бы с радостью ее использовал.

Предпосылки: Я экспериментирую со структурами Vlist, описанными там (конечная цель - своего рода интерпретатор схемы), и в настоящее время я выполняю сборку мусора для этих списков. Мне нужны довольно большие блоки памяти как арены для сборщика мусора. Если я поменяю технику сборки мусора, мне все равно нужно, чтобы блоки VList имели 32-байтовое выравнивание (я проводил свои эксперименты на 64-битных машинах).

9
задан Community 23 May 2017 в 02:12
поделиться