Re[2]: Как выделить одному приложению 5 ГБ памяти?
От: Pavel Dvorkin Россия  
Дата: 10.01.08 11:43
Оценка: 6 (3)
Здравствуйте, Skipper_N, Вы писали:

Прочитал я все, что тут понаписали. Совет насчет VirtualAlloc могу только поддержать, но вот new намерен реабилитировать (частично

S_N> int* p = new int[1250000000];


S_N> 4. Делаем в тулбаре справа от написанного текста "Debug" — вместо "Win32" — "x64". (для этого в Configuration Manager, заходим в "Active Solution Platform", <New...>).


S_N> Теперь у нас 64-разрядное приложение, мы его компилируем и оно компилится.


И выдается при этом

warning C4307: '*' : integral constant overflow

как раз на эту строчку.

Заменяем на

__int64 size = 1250000000;
int* p = new int[size];

а для проверки

p[size — 1] = 0;


У меня на машине только 2Гб, поэтому new отрабатывал несколько минут, в течение которых был почти полностью заблокирован интерфейс пользователя, а иногда даже нажати на Caps Lock не приводило к включению лампочки и курсор мыши не передвигался . Но я набрался терпения и дождался, когда это кончится, после чего оператор проверки сработал без проблем.

S_N>Вот такое неожиданное открытие я сделал.


Предлагаю открытие это закрыть

>В книжках, о том, сколько максимум способен выделить один new (4 ГБ) — почему-то не пишут...


И правильно делают

>И пока у всех 32-разрядные платформы, никто этим не занимался. Но в будущем, возможно, когда будут 64-разрядные платформы, еще много кто сделает для себя такое открытие.


Надеюсь, не будут

Ну а что касается того, что new реабилитирован частично — не надо в куче такие блоки выделять.

int* p = (int*) VirtualAlloc(NULL, size * 4, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);

сработало мгновенно. Реально при этом ничего не выделяется — зачем ? Будут обращения — тогда и будет выделяться.

Куча — вещь довольно сложная, не надо с ней так обращаться. Даже если на машине >4 Gb.
With best regards
Pavel Dvorkin
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.