В C++ существует ли макс. предел длины массива?

163
задан Peter Mortensen 18 December 2009 в 22:26
поделиться

7 ответов

Существует два предела, оба не осуществленные C++, а скорее аппаратными средствами.

первый предел (никогда не должен достигаться) устанавливается ограничениями типа размера, используемого для описания индекса в массиве (и размер этого). Это дано максимальным значением, которое может принять система std::size_t. Этот тип данных должен всегда быть самым большим целым типом системы.

другой предел является пределом физической памяти. Чем больше Ваши объекты в массиве, тем раньше этот предел достигнут, потому что память полна. Например, vector<int> из данного размера n обычно сопровождает в четыре раза больше памяти, чем массив типа vector<char> (минус маленькая постоянная величина). Поэтому vector<char> может содержать больше объектов, чем vector<int>, прежде чем память будет полна. Те же счета для собственных массивов C-стиля int[] и char[].

Кроме того, этот верхний предел может быть под влиянием типа allocator, раньше создавал vector, потому что allocator свободно управлять памятью любым путем, это хочет. Очень нечетное, но nontheless мыслимое средство выделения могло объединить память таким способом который идентичные экземпляры объектной доли ресурсы. Таким образом, Вы могли вставить много одинаковых объектов в контейнер, который иначе израсходует всю доступную память.

, Кроме которого, C++ не осуществляет пределов.

156
ответ дан Konrad Rudolph 23 November 2019 в 21:17
поделиться

Никто не упомянул предел на размер стековый фрейм .

существует две памяти мест, может быть выделен:

  • На "куче" (динамично выделенная память).
    предел размера здесь является комбинацией доступных аппаратных средств и способности ОС моделировать пространство при помощи других устройств, чтобы временно хранить неиспользованные данные ( т.е. страницы перемещения к жесткому диску).
  • На стеке (Локально объявленные переменные).
    предел размера здесь является определенным компилятором (с возможными аппаратными пределами). При чтении документации компилятора, можно часто настраивать этот размер.

Таким образом, если Вы выделяете массив динамично (предел является большим и описан подробно другими сообщениями.

int* a1 = new int[SIZE];  // SIZE limited only by OS/Hardware

, Кроме того, если массив выделяется на стеке тогда, Вы ограничены размером стекового фрейма. N.B. векторы и другие контейнеры имеют маленькое присутствие в стеке, но обычно объем данных будет на "куче".

int a2[SIZE]; // SIZE limited by COMPILER to the size of the stack frame
156
ответ дан Martin York 23 November 2019 в 21:17
поделиться

Смотря на него с практической, а не теоретической точки зрения, в системе Windows на 32 бита, максимальная общая сумма памяти, доступной для единственного процесса, составляет 2 ГБ. Можно повредить предел путем движения в операционную систему на 64 бита с намного большей физической памятью, но сделать ли это или искать альтернативы, зависит очень от предполагаемых пользователей и их бюджетов. Можно также расширить его несколько использование PAE.

тип массива очень важен, поскольку выравнивание структуры по умолчанию на многих компиляторах составляет 8 байтов, который очень расточителен, если использование памяти является проблемой. При использовании Visual C++ для предназначения для Windows, проверьте пакет #pragma директива как способ преодолеть это.

Другая вещь сделать посмотреть на то, что в методах сжатия памяти могло бы помочь Вам, такие как разреженные матрицы, на лету сжатие, и т.д. Снова это является очень зависящим от приложения. Если Вы редактируете свое сообщение для предоставления еще некоторой информации относительно того, что находится на самом деле в массивах, Вы могли бы получить более полезные ответы.

Редактирование: Учитывая немного большую информацию о Ваших строгих требованиях, Ваше устройство хранения данных должно, казаться, быть между 7,6 ГБ и несжатыми 76 ГБ, который потребовал бы, чтобы довольно дорогое поле на 64 бита сохранило как массив в памяти в C++. Это поднимает вопрос, почему Вы хотите хранить данные в памяти, где каждый предполагает для скорости доступа, и предоставить произвольный доступ. Лучший способ хранить эти данные за пределами массива в значительной степени на основе того, как Вы хотите получить доступ к нему. Если необходимо получить доступ к участникам массива случайным образом, для большинства приложений имеет тенденцию быть способами сгруппировать глыбы данных, которые имеют тенденцию быть полученными доступ одновременно. Например, в большом GIS и пространственных базах данных, данные часто размещаются рядом географической областью. В условиях программирования на C++ можно переопределить [] оператор массива для выборки частей данных из внешнего устройства хранения данных как требуется.

13
ответ дан Peter Mortensen 23 November 2019 в 21:17
поделиться

Я согласился бы с вышеупомянутым, что, если Вы инициализируете свой массив с

 int myArray[SIZE] 

тогда, РАЗМЕР ограничен размером целого числа. Но Вы всегда можете malloc блок памяти и иметь указатель на него, столь большой, как Вы хотите, пока malloc не возвращает ПУСТОЙ УКАЗАТЕЛЬ.

4
ответ дан Tarski 23 November 2019 в 21:17
поделиться

Одна вещь я не думаю, была упомянута в предыдущих ответах.

я всегда обнаруживаю "неприятный запах" в смысле рефакторинга, когда люди используют такие вещи в своем дизайне.

Это - огромный массив и возможно не лучший способ представить Ваши данные и с точки зрения эффективности и с точки зрения производительности.

аплодисменты,

Rob

2
ответ дан Rob Wells 23 November 2019 в 21:17
поделиться

Как был уже указан, размер массива ограничен Вашими аппаратными средствами и Вашей ОС (человек ulimit). Ваше программное обеспечение, хотя, может только быть ограничено Вашей креативностью. Например, можно ли сохранить "массив" на диске? Вам действительно нужны долгие длинные целые? Вам действительно нужен плотный массив? Вам даже нужен массив вообще?

Одно простое решение должно было бы использовать Linux на 64 бита. Даже если у Вас физически не будет достаточного количества поршня для Вашего массива, ОС позволит Вам выделять память, как будто Вы делаете, так как виртуальная память, доступная Вашему процессу, вероятно, намного больше, чем физическая память. Если действительно необходимо получить доступ ко всему в массиве, это составляет хранение его на диске. В зависимости от Ваших схем доступа могут быть более эффективные способы сделать это (т.е.: использование mmap (), или просто хранить данные последовательно в файле (в этом случае Linux на 32 бита был бы достаточен)).

0
ответ дан ejgottl 23 November 2019 в 21:17
поделиться

Если вам приходится иметь дело с данными такого размера, вам необходимо разделить их на управляемые части. Все это не поместится в памяти ни на одном маленьком компьютере. Вы, наверное, можете загрузить часть данных с диска (все, что подходит), выполнить вычисления и внести в нее изменения, сохранить на диск и повторить до завершения.

2
ответ дан 23 November 2019 в 21:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: