У меня проблема и не удалось найти решение (из-за отсутствия знаний).
Проблема в том, что мое приложение (написанное в 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-структуру приложения.
Причина, по которой ваше приложение перестает заполнять память после 4 ГБ, связано с тем, что оно использует 32-битные указатели. С 32 битами вы можете представлять только 2^32
или 4 294 967 296 байт памяти. Физически говоря, вы не можете заполнить больше места.
Более конкретно, вашей программе также может быть предоставлено максимум 4 ГБ страниц из ОС, поэтому использование 2 32-разрядных указателей не поможет.
К сожалению, это означает, что вы должны сделать коммутатор до 64-битного, что позволит значительно сократить количество мест памяти.