2012-01-29 1 views
4

При решении проблемы, связанной с DP, я заметил, что сначала работает, но второй seg-сбои. Какова фактическая причина и каков предел памяти для использования int?Имея большие массивы 2d: static int vs int

int main(){ 
    static int a[3160][3160]; 
    return 0; 
} 

int main(){ 
    int a[3160][3160]; 
    return 0; 
} 
+0

Возможный дубликат [Ограничения по размеру массива] (http://stackoverflow.com/questions/9016538/array-size-limits) –

ответ

5

Поскольку у вас, вероятно, недостаточно памяти стека для хранения этого большого массива.

Второй пример создает массив в стеке, в то время как первый пример создает массив, который не находится в стеке, а где-то в сегменте данных/Bss, поскольку вы явно указываете критерии хранения с использованием квалификатора static.

Обратите внимание, что C++ стандарт не определяет stack или heap или data segment или Bss segment все эти реализации определены детали. Стандарт только определяет поведение, ожидаемое от переменных, объявленных с разными критериями хранения. Итак, , где переменные на самом деле создано - это реализация, но одна вещь наверняка - оба примера создадут массивы в разных областях памяти, а вторая сбой, потому что в этом регионе недостаточно памяти.

Кроме того, возможно, если вы создаете массив таких огромных размеров в реальной реализации, ваш дизайн кажется ошибочным, и вы можете подумать о его пересмотре.

Вы могли бы также рассмотреть возможность использования std::array или std::vector, вместо традиционных массивов с стилем.

+0

«примеры создадут массивы в разных областях памяти». Что я думал, что происходит: короткие и короткие Приятно, если нет другого ответа, я отмечу это :) –

1

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

Размер стека варьируется в зависимости от платформы/оборудования. Поэтому «предел памяти» резко меняется. Если вы используете огромные массивы стека, подобные этому, будьте готовы часто видеть эту ошибку, когда ваша программа запускается на процессоре, отличном от того, который вы используете для разработки. Если вам абсолютно необходим такой большой стек, вы должны создать свои собственные потоки с явным размером стека.

Однако эта мера не нужна, потому что вы должны просто использовать динамическое распределение здесь.

static не является хорошим выбором, если вам нужно, чтобы он был реентерабельным.

Как заметил Als (+1) - причина ошибки во время выполнения - это, скорее всего, размер стека.