Существует два предела, оба не осуществленные C++, а скорее аппаратными средствами.
первый предел (никогда не должен достигаться) устанавливается ограничениями типа размера, используемого для описания индекса в массиве (и размер этого). Это дано максимальным значением, которое может принять система std::size_t
. Этот тип данных должен всегда быть самым большим целым типом системы.
другой предел является пределом физической памяти. Чем больше Ваши объекты в массиве, тем раньше этот предел достигнут, потому что память полна. Например, vector<int>
из данного размера n обычно сопровождает в четыре раза больше памяти, чем массив типа vector<char>
(минус маленькая постоянная величина). Поэтому vector<char>
может содержать больше объектов, чем vector<int>
, прежде чем память будет полна. Те же счета для собственных массивов C-стиля int[]
и char[]
.
Кроме того, этот верхний предел может быть под влиянием типа allocator
, раньше создавал vector
, потому что allocator
свободно управлять памятью любым путем, это хочет. Очень нечетное, но nontheless мыслимое средство выделения могло объединить память таким способом который идентичные экземпляры объектной доли ресурсы. Таким образом, Вы могли вставить много одинаковых объектов в контейнер, который иначе израсходует всю доступную память.
, Кроме которого, C++ не осуществляет пределов.
Никто не упомянул предел на размер стековый фрейм .
существует две памяти мест, может быть выделен:
Таким образом, если Вы выделяете массив динамично (предел является большим и описан подробно другими сообщениями.
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
Смотря на него с практической, а не теоретической точки зрения, в системе Windows на 32 бита, максимальная общая сумма памяти, доступной для единственного процесса, составляет 2 ГБ. Можно повредить предел путем движения в операционную систему на 64 бита с намного большей физической памятью, но сделать ли это или искать альтернативы, зависит очень от предполагаемых пользователей и их бюджетов. Можно также расширить его несколько использование PAE.
тип массива очень важен, поскольку выравнивание структуры по умолчанию на многих компиляторах составляет 8 байтов, который очень расточителен, если использование памяти является проблемой. При использовании Visual C++ для предназначения для Windows, проверьте пакет #pragma директива как способ преодолеть это.
Другая вещь сделать посмотреть на то, что в методах сжатия памяти могло бы помочь Вам, такие как разреженные матрицы, на лету сжатие, и т.д. Снова это является очень зависящим от приложения. Если Вы редактируете свое сообщение для предоставления еще некоторой информации относительно того, что находится на самом деле в массивах, Вы могли бы получить более полезные ответы.
Редактирование: Учитывая немного большую информацию о Ваших строгих требованиях, Ваше устройство хранения данных должно, казаться, быть между 7,6 ГБ и несжатыми 76 ГБ, который потребовал бы, чтобы довольно дорогое поле на 64 бита сохранило как массив в памяти в C++. Это поднимает вопрос, почему Вы хотите хранить данные в памяти, где каждый предполагает для скорости доступа, и предоставить произвольный доступ. Лучший способ хранить эти данные за пределами массива в значительной степени на основе того, как Вы хотите получить доступ к нему. Если необходимо получить доступ к участникам массива случайным образом, для большинства приложений имеет тенденцию быть способами сгруппировать глыбы данных, которые имеют тенденцию быть полученными доступ одновременно. Например, в большом GIS и пространственных базах данных, данные часто размещаются рядом географической областью. В условиях программирования на C++ можно переопределить [] оператор массива для выборки частей данных из внешнего устройства хранения данных как требуется.
Я согласился бы с вышеупомянутым, что, если Вы инициализируете свой массив с
int myArray[SIZE]
тогда, РАЗМЕР ограничен размером целого числа. Но Вы всегда можете malloc блок памяти и иметь указатель на него, столь большой, как Вы хотите, пока malloc не возвращает ПУСТОЙ УКАЗАТЕЛЬ.
Одна вещь я не думаю, была упомянута в предыдущих ответах.
я всегда обнаруживаю "неприятный запах" в смысле рефакторинга, когда люди используют такие вещи в своем дизайне.
Это - огромный массив и возможно не лучший способ представить Ваши данные и с точки зрения эффективности и с точки зрения производительности.
аплодисменты,
Rob
Как был уже указан, размер массива ограничен Вашими аппаратными средствами и Вашей ОС (человек ulimit). Ваше программное обеспечение, хотя, может только быть ограничено Вашей креативностью. Например, можно ли сохранить "массив" на диске? Вам действительно нужны долгие длинные целые? Вам действительно нужен плотный массив? Вам даже нужен массив вообще?
Одно простое решение должно было бы использовать Linux на 64 бита. Даже если у Вас физически не будет достаточного количества поршня для Вашего массива, ОС позволит Вам выделять память, как будто Вы делаете, так как виртуальная память, доступная Вашему процессу, вероятно, намного больше, чем физическая память. Если действительно необходимо получить доступ ко всему в массиве, это составляет хранение его на диске. В зависимости от Ваших схем доступа могут быть более эффективные способы сделать это (т.е.: использование mmap (), или просто хранить данные последовательно в файле (в этом случае Linux на 32 бита был бы достаточен)).
Если вам приходится иметь дело с данными такого размера, вам необходимо разделить их на управляемые части. Все это не поместится в памяти ни на одном маленьком компьютере. Вы, наверное, можете загрузить часть данных с диска (все, что подходит), выполнить вычисления и внести в нее изменения, сохранить на диск и повторить до завершения.