Здравствуйте, 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.