Выделение массива более 2 ГБ в C (или C ++) - PullRequest
0 голосов
/ 20 сентября 2018

Я использую Windows 10 64 бит.Мой компилятор - Visual Studio 2015.

Что мне нужно:

unsigned char prime[UINT_MAX];

(и более крупные массивы).В этом примере выдается ошибка компилятора C2148, поскольку приложение является «консольным приложением Win32».Также я не могу использовать new для создания массива;та же проблема.Я создаю его как «x64 Release», но я думаю, что консольная часть WIN32 выигрывает!

Я хочу раскрыть возможности моей 64-битной операционной системы и освободиться от этого утомительного ограничения INT_MAX на индексы массива, то есть правильная 64-битная операция.Мое приложение - это простая программа на C / C ++, которая не нуждается и не хочет ничего, кроме интерфейса командной строки.

Я установил (бесплатное) приложение Visual Studio 2017, но оно не давало мне простой консолиприложения, которые мне нравятся (поэтому я удалил их).

Есть ли какой-нибудь другой тип приложений, который я могу создать в Visual Studio, который дает доступ к более чем 4 ГБ памяти?Есть ли какой-то другой (бесплатный) компилятор, который я могу использовать для получения полного 64-битного доступа под Windows?

1 Ответ

0 голосов
/ 21 сентября 2018

Позвольте мне сначала правильно ответить на вопрос, чтобы информация была легко доступна другим. Все три действия были необходимы .Любой один или два не будут работать.

  1. Измените тип проекта с «Консоль Win32» на «Консоль C ++ / CLR»
  2. Измените определение массива, как любезно указано WhozCraig
  3. Изменить свойства проекта, 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 ГБ выделено процессу в соответствии с диспетчером задач.

...