Позвольте мне сначала правильно ответить на вопрос, чтобы информация была легко доступна другим. Все три действия были необходимы .Любой один или два не будут работать.
- Измените тип проекта с «Консоль Win32» на «Консоль C ++ / CLR»
- Измените определение массива, как любезно указано WhozCraig
- Изменить свойства проекта, Linker |Система | EnableLargeAddresses ДА (/ LARGEADDRESSAWARE)
Теперь давайте упомянем некоторые комментарии:
«Скомпилируйте программу для архитектуры x64, а не x32» ** Iпрямо указано, что он был скомпилирован как выпуск x64, и что аспект Win32, вероятно, выиграл.
Он не будет работать, если размещен в стеке.** Он был выделен в куче как глобальная переменная, но я также сказал, что попытался выделить его с помощью new , который также выделил бы кучу.
Сколько памяти вы обрабатываетеиметь?** В самом деле.Моя 8 ГБ ОЗУ немного слабая для приложения, но не выдаст ошибку компилятора, и ее достаточно для запуска программы с выделенными для нее 4 ГБ.
Возможное дублирование…** Нет, есть очень старые вопросы, которые не очень актуальны.
Файлы с отображением в памяти (Томас Мэтьюз) Очень хорошая идея.Спасибо.
Что касается 6 голосов против, серьезно.Кажется, что большинство комментаторов даже не поняли проблему, не говоря уже о решении.Стандартные массивы C, по-видимому, индексируются с помощью подписанных целых чисел (32 бита) независимо от параметра / LARGEADDRESSAWARE и компиляции x64.
Еще раз спасибо WhozCraig и Thomas Matthews за помощь в решении этой проблемы.
#include <vector>
typedef unsigned long long U64;
const U64 MAX_SIZE = 3*((U64)INT_MAX);
std::vector<unsigned char>prime(MAX_SIZE);
// The prime vector is then accessed in the usual way, prime[bigAddress]
Я также отключил поддержку Юникода в настройках проекта, так как это могло сделать символы длиной 2 байта.
Программа сейчас запущенана рабочей станции Xeon с 32 ГБ ОЗУ ECC.
6 ГБ выделено процессу в соответствии с диспетчером задач.