Выделите большую память, используя систему x64 с приложением x86 в c ++

0

У меня проблема и не удалось найти решение (из-за отсутствия знаний).

Проблема в том, что мое приложение (написанное в c++ скомпилированное с помощью mingw x86 с использованием Qt 5.3.2) выделяет блоки памяти, которые в сумме должны вмещать от 7,5 до 8,5 ГБ (я предварительно вычислил это с помощью calc). Каждый блок составляет 1 МБ.

Приложение выделяет память в цикле, одна итерация выделяет 1 МБ памяти.
У меня всего 8 ГБ памяти, но когда я использую мониторы, чтобы увидеть, когда перестанет выделяться, я вижу, что это не зависит от того, сколько памяти размещено в момент запуска приложения.

Он всегда перестает выделять, когда приложение выделяет 4 ГБ, и это не зависит от того, что в системе все еще есть 2 бесплатных ГБ (до запуска у меня почти 6 ГБ бесплатно 8) или нет.

Поэтому я не могу понять, почему так происходит, но я думаю, что это из-за структуры x86 приложения.

Но мне тоже нужно использовать приложение на системах x86 (я знаю, что такой системы x86 не может быть более 4 ГБ).

Как я могу решить проблему?

Я предпочитаю, чтобы сохранить структуру x86 приложения и позволить ей выделять более 4 ГБ.
Но если такого решения не будет, я бы предложил использовать x64-структуру приложения.

  • 2
    Просто создайте отдельные версии вашего приложения для 64-битных и 32-битных систем. 32-разрядные приложения просто не могут использовать более четырех гигабайт памяти.
  • 0
    Возможный дубликат: stackoverflow.com/questions/5626090/…
Показать ещё 3 комментария
Теги:
qt
64bit
memory
mingw32

1 ответ

2
Лучший ответ

Причина, по которой ваше приложение перестает заполнять память после 4 ГБ, связано с тем, что оно использует 32-битные указатели. С 32 битами вы можете представлять только 2^32 или 4 294 967 296 байт памяти. Физически говоря, вы не можете заполнить больше места.

Более конкретно, вашей программе также может быть предоставлено максимум 4 ГБ страниц из ОС, поэтому использование 2 32-разрядных указателей не поможет.

К сожалению, это означает, что вы должны сделать коммутатор до 64-битного, что позволит значительно сократить количество мест памяти.

  • 0
    Альтернативное решение может быть (как предложено в stackoverflow.com/questions/5626090/… ) изменить дизайн приложения и использовать несколько процессов, которые взаимодействуют друг с другом, и они могут вместе использовать больше памяти. Это сложнее, но если переход на 64-битную версию не подходит, то это единственный способ, о котором я могу подумать.
  • 0
    Да, я думал об этом, но похоже, что у меня куда больше проблем, чем просто компиляция в 64-битном режиме.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню