Могу ли я (ab) использовать VirtualAlloc для каждого векторного контейнера в игре?

Представь, что я делаю игру

  • Я знаю, что он будет работать в 64-битной системе, в 64-битной ОС
  • бюджет памяти для игры фиксирован 2 (или 4) гибибайта

Это будет означать, что из 64 бит Virtual Address Space для процесса, я бы получил 32 бита, чтобы поиграть, как я хочу?

Могу ли я - например - для каждого контейнера в игре (контейнер = что-то вроде std::vector) использовать VirtualAlloc а также MEM_RESERVE 2 гибибайта памяти?

По мере добавления новых элементов новые pages (где-то около 64К) MEM_COMMITпо мере необходимости Когда контейнер умирает, память освобождается VirtualFree соответственно.

Из любопытства:

  1. Будет ли это технически работать?

  2. Есть ли какие-то причины для производительности, чтобы этого не делать?


РЕДАКТИРОВАТЬ: Уточнение: если в игре 10000 контейнеров, это зарезервирует 2 ГБ * 10000 памяти - НО выделенная память будет менее 2 (или 4) ГиБ.

Эти 10000 контейнеров также могут составить 2^16 контейнеров (или столько, сколько позволяет адресное пространство).

1 ответ

Да, это можно заставить работать.

Когда я поэкспериментировал с ним1, я обнаружил, что он по-прежнему работает лучше всего для выделения памяти, начиная с довольно большого куска памяти (например, мегабайта), затем следуя геометрической прогрессии размеров. призвание VirtualAlloc (по-видимому) требует переключения в режим ядра, так что есть достаточно накладных расходов, которые вы хотите избегать делать это очень часто, если можете помочь.


1. Хотя это было довольно давно -Windows NT 4 или, может быть, временные рамки Windows 2000, так что с тех пор все могло измениться.

Другие вопросы по тегам