Разработка 32-битного C ++ приложения в 64-битной Windows 7 - PullRequest
2 голосов
/ 07 февраля 2012

Я разрабатываю приложение Win32 в Visual Studio 2008 (C ++).Он отлично работает в 32-битной или 64-битной Windows 7. Однако иногда мне нужно выделить довольно большие буферы памяти (приложение работает с большим количеством данных), и если я делаю это в 64-битной Windows 7, это не удаетсяв 32-битном он работает нормально.Под большими буферами памяти я подразумеваю одну ~ 250 МБ, а другую ~ 150 МБ.На моем компьютере установлено 8 ГБ ОЗУ, и, согласно моей информации, 64-разрядная ОС предоставляет 4 ГБ для 32-разрядного приложения.Мне не нужно приближаться к этому пределу, но malloc не работает.Есть идеи, почему и что я могу с этим сделать?Заранее спасибо.

Ответы [ 3 ]

1 голос
/ 07 февраля 2012

150 МБ и 250 МБ - не особо большие ассигнования. Как уже отмечали другие, проблема, с которой вы сталкиваетесь, - это, скорее всего, фрагментация адресного пространства (т. Е. Свободного места достаточно, просто оно не целиком).

В дополнение к другим предложениям:

  • Выделите память, как только программа запустится. Адресное пространство с меньшей вероятностью будет фрагментировано. Если было бы неразумно выделять столько памяти на срок службы программы, используйте VirtualAlloc с флагом MEM_RESERVE, чтобы зарезервировать адресное пространство и зафиксировать его позже.
  • Если адресное пространство фрагментируется при запуске процесса, это, вероятно, вызвано загрузкой DLL в бесполезных местах. Вы можете использовать VMMap , чтобы увидеть, что происходит в адресном пространстве. Если принадлежащие вам библиотеки DLL фрагментируют адресное пространство, вы можете перебазировать их.
1 голос
/ 07 февраля 2012

Вы достигли ограничения виртуального адресного пространства в двоичном файле Win32. Ограничение может составлять от 2 до 4 ГБ в зависимости от ОС и среды . Фактический лимит меньше из-за фрагментации распределения.

Ваш выбор:

0 голосов
/ 04 апреля 2012

Я думаю, что есть ошибка в malloc под win7-64.Я провел те же тесты с моим 32-битным приложением на трех машинах: XP32, w7-32 и win7-64.Он работает нормально на 32-битных платформах, но не может выделить 110-мегабайтный блок под w7-64.Я произвел дефрагментацию диска и снова попытался выполнить чистую перезагрузку с тем же результатом.

К

...