Чтобы работало мое приложение (алгоритм) — нужно 5 ГБ памяти, меньше никак.
Казалось бы, я уже ВСЕ ВОЗМОЖНОЕ для этого сделал... Купил 4 планки по 2 гигабайта каждая.
Процессор 64-разрядный (Athlon 64 4000+ ). Именно 64-разрядный проц нужен для того, чтобы поставить 64-разрядную ОС. Я поставил Windows Professional x64 Edition. Windows "видит" всю память — в Task Manager-e отображается вся — 8 ГБ. Именно 64-разрядная ОС должна быть, чтобы создавать 64-разрядные приложения и "стал" 64-разрядный компилер. Я поставил MS Visual Studio 2005 Professional. Там есть 64-разрядный компилятор и можно выбрать опцию — компилировать не для Win32 (это по умолчанию), а для x64.
Я проверил — создано действительно 64-разрядное приложение "по всем статьям", так сказать. Т.е. оно в обычной 32-разрядной Windows не выполняется, при дизассемблировании вижу, что арифм. операции с 64-разрядными int выполняются за 1 машинную инструкцию (чего нет в 32-разрядных), также длина указателей стала не 32 бита (4 байта), как раньше, типа 0x7fffffff, а 64 бита (8 байт) — например 0x000000012d265000.
Зачем нужны были эти все шаги? Все просто — 32-разрядное приложение не может адресовать более 4 гигабайта оперативной памяти (2 в степени 32 — даст около 4 млрд байт), а на деле — не более 3 гигабайт винда даст адресовать. Для 64-разрядных приложений предел вообще порядка 10^18 степени байт, и я понимаю, что можно ввести какие-то ограничения, НО ЗАЧЕМ ДЕЛАТЬ ТАКИЕ ЖЕ ОГРАНИЧЕНИЯ, КАК И ДЛЯ 32-РАЗРЯДНОЙ -- 3 ГБ ??
В приложении выделил свои 5 ГБ — скомпилировал, ошибки нет, но в Task Manager-e показано, что приложению выделено только 3 ГБ примерно. Какой же тогда смысл переходить на 64-разрядную архитектуру, и какой смысл в таких указателях — 0x000000012d265000, если много нулей не используется? Начал инициализировать этот выделенный 5-гигабайтный массив — и точно, после того как прошел примерно 3 ГБ, вылетела ошибка.
Если приложение под CLR — то вылетает —
An Unhandled exception of type 'System.AccessViolationException' occured in ...exe
Additional Information: Attempted to read or write protected memory. This is often an indication that other memory
is corrupt.
Если же приложение под MFC — то вылетает —
Unhandled exception at 0x004065ed in WMFC3264.exe: 0xC0000005: Access violation reading location
0x000000012d265000.
Т.е. то ли в студии нужно разрешить больше памяти использовать в heap (такая опция была в Borland C++ Builder помню), но поискав в опциях проекта — ничего подобного не нашел, то ли в Windows есть ограничение на выделение памяти одному приложению. Попробовал изменить параметры винды в My Computer — Properties — Advanced — Performance Setting — Advanced — результата никакого. Может, есть еще какие-нибудь настройки в винде или студии?
Как справиться с такой проблемой? Неужели до сих пор нельзя выделить памяти 5 ГБ одному приложению ? Я шокирован буду если так... На дворе 2008 год наступает...
02.01.08 10:20: Перенесено из 'Архитектура программного обеспечения'