Представь, что я делаю игру
Это будет означать, что из 64 бит Virtual Address Space
для процесса, я бы получил 32 бита, чтобы поиграть, как я хочу?
Могу ли я — например — для каждый контейнер в игре (контейнер = что-то вроде std::vector
) использовать VirtualAlloc
а также MEM_RESERVE
2 гибибайта памяти?
По мере добавления новых элементов новые pages
(где-то около 64К) MEM_COMMIT
по мере необходимости Как контейнер умирает память освобождается с VirtualFree
соответственно.
Из любопытства:
Будет ли это технически Работа?
Есть ли какие-то причины для производительности, чтобы этого не делать?
РЕДАКТИРОВАТЬ: Уточнение: если в игре 10000 контейнеров, это будет резерв 2 ГБ * 10000 памяти — НО поручены память будет менее 2 (или 4) ГиБ.
Эти 10000 контейнеров также могут составить 2 ^ 16 контейнеров (или столько, сколько позволяет адресное пространство).
Да, это можно заставить работать.
Когда я поиграл с этим1, Я обнаружил, что все равно лучше всего использовать для этого память, начиная с довольно большого фрагмента памяти (например, мегабайта), затем следуя геометрической прогрессии размеров. призвание VirtualAlloc
(по-видимому) требует переключения в режим ядра, так что есть достаточно накладных расходов, которые вы хотите избегать делать это очень часто, если можете помочь.
1. Хотя это было довольно давно — Windows NT 4 или, может быть, временные рамки Windows 2000, так что с тех пор все могло измениться.
Других решений пока нет …