Статическое распределение памяти в Vista приводит к сбою? - PullRequest
0 голосов
/ 04 декабря 2008

Я использую Microsoft Visual C ++ 2008 Express, и у меня довольно неприятная проблема. В XP такого не происходит, но в Vista я не могу найти способ обойти это. Всякий раз, когда я объявляю переменные нединамически, если их объединенный размер превышает около 30 МБ, программа сразу после запуска вылетает. Я знаю, что Vista ограничивает приложения, отличные от Win32, до 32 МБ памяти, но я не думаю, что это моя проблема. Я использую компилятор Microsoft, и это происходит независимо от того, является ли это консольным приложением win32 или оконным приложением win32. Я просто заявляю, как ...

int foo[1000][1000]

... или любая комбинация переменных, приводящая к одинаковому размеру в любом месте, и это прощай приложение. Забавно то, что примерно в 25% случаев он запускается, хотя эта ошибка существует. Я что-то упустил здесь из-за фундаментального программирования? Является ли статическое распределение устаревшим? Мне придется переделывать все приложение, чтобы использовать динамическое распределение?

Ответы [ 3 ]

3 голосов
/ 04 декабря 2008

Является ли статическое распределение устаревшим?

Вы не делаете статическое распределение - вы делаете автоматическое распределение, и, как сказали другие, у вас заканчивается стек.

Существует три основных способа зарезервировать место для данных в C ++:

  1. В стеке - они называются «автоматическими переменными» и представляют собой обычные локальные переменные функции. Предполагая, что ваш "int foo [] []" является локальным по отношению к main (), то это то, что это. Автоматические данные ограничены доступным размером стека, но их можно быстро распределить * (практически нулевое время).

  2. Статически - это либо локальные переменные функции, либо переменные класса, которые начинаются со слова «статические», или они являются переменными, определенными вне области функций или классов. Статические данные зарезервированы компилятором. Никаких накладных расходов на выделение времени нет, но память зарезервирована для всего времени выполнения приложения.

  3. В куче - они выделяются с помощью 'new' или 'malloc' или каким-то механизмом, который выполняет эти вызовы внутри. Распределение и освобождение медленные по сравнению с первыми двумя, но у вас может быть столько памяти, сколько даст система, и вы можете вернуть ее, когда закончили с ней.

Существуют тонкие вариации этих трех - например, alloca - это гибрид 1 и 3, но это основы.

1 голос
/ 04 декабря 2008

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

В настройках ссылки скорее всего

У меня только MSDEV 2005 на работе, но вот что говорится об опции компоновщика стека:

Параметр / STACK устанавливает размер стека в байтах. Этот параметр предназначен только для использования при создании файла .exe.

Эта опция указывает общее выделение стека в виртуальной памяти. Размер стека по умолчанию составляет 1 МБ. Компоновщик округляет указанное значение до ближайших 4 байтов.

EDIT

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

0 голосов
/ 04 декабря 2008

Проблема заключается в том, что нединамически распределяемые переменные в методах размещаются в стеке, и максимальный размер стека НАМНОГО меньше общей доступной памяти. Я думаю, что это около 30 МБ в Windows, да. По иронии судьбы, то, что вы сделали здесь, это тезка самого сайта. Переполнение стека.

Редактировать: Согласно http://www.cs.nyu.edu/exact/core/doc/stackOverflow.txt максимальный размер стека окна составляет 32 МБ.

...