Распределение памяти Win32 с большим выравниванием - PullRequest
3 голосов
/ 01 октября 2011

Мне нужно выделить большие области памяти (мегабайты) с большими выравниваниями (также потенциально в диапазоне мегабайт). Семейство функций VirtualAlloc, похоже, не предоставляет возможности сделать это.

Что я делаю в Linux, чтобы добиться этого, так это отобразить больший регион - достаточно большой, чтобы гарантировать, что в нем будет содержаться достаточно большой регион с требуемым выравниванием - и затем отобразить регионы в начале и в конце большой регион, который не нужен.

В качестве примера, скажем, мне нужно 4 мегабайта, выровненных по границе 1 мегабайт (то есть начало области, имеющей нули в младших 20 битах). Я бы mmap 5 мегабайт. Допустим, я получаю регион 0x44ff000-0x49ff000. Внутри этого региона содержится область 0x4500000-0x4900000, которая выровнена по границе в 1 мегабайт. Я бы тогда munmap 0x44ff000-0x4500000 и 0x4900000-0x49ff000.

Могу ли я сделать что-то подобное на Win32? Если я использую VirtualProtect с PAGE_NOACCESS, будет ли освобождена память? Есть ли лучшее решение?

Ответы [ 2 ]

6 голосов
/ 01 октября 2011

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

0 голосов
/ 01 октября 2011

Посмотрите на источник для _aligned_malloc в windows / MSVC crt, очень просто использовать тот же метод для выравнивания виртуальной памяти, я бы даже сказал, просто заменив его внутреннюю malloc вызов (то же самое относится и к _aligned_free), это позволяет выделять только системный вызов single .

Однако, зачем вам такое масштабное выравнивание?Вы пытаетесь использовать шаблоны адресов для быстрых блоков памяти?

...