Мне нужно выделить большие области памяти (мегабайты) с большими выравниваниями (также потенциально в диапазоне мегабайт). Семейство функций VirtualAlloc, похоже, не предоставляет возможностей для этого.
Что я делаю в Linux, чтобы достичь этого, так это mmap большего региона — достаточно большого, чтобы гарантировать, что в нем будет содержаться достаточно большой регион с требуемым выравниванием, — а затем munmap регионов в начале и конце большого региона, который не нужны.
В качестве примера предположим, что мне нужно 4 мегабайта, выровненных по границе 1 мегабайта (т. е. начало области с нулями в младших 20 битах). Я бы mmap 5 мегабайт. Допустим, я получаю регион 0x44ff000-0x49ff000. Внутри этого региона содержится регион 0x4500000-0x4900000, который выровнен по границе 1 мегабайта. Я бы тогда munmap 0x44ff000-0x4500000 и 0x4900000-0x49ff000.
Могу ли я сделать что-то подобное на Win32? Если я использую VirtualProtect с PAGE_NOACCESS, будет ли освобождена память? Есть ли лучшее решение?