Почему мой большой 5D массив вызывает исключение переполнения стека только как переменную-член? - PullRequest
0 голосов
/ 03 октября 2011

В настоящее время я пишу программу, в которой мне нужно запустить много симуляций, а скорость - это название игры. В настоящее время я использую один длинный линейный массив, выделенный для кучи, и сам определяю размеры и вытягиваю прямо из индекса, который я работаю. Сотрудник написал аналогичную программу и получил хороший прирост скорости благодаря использованию 5D массива. Я знаю, что было бы очень легко выделить это как вектор, но насколько я знаю, есть скорость, чтобы использовать вектор в результате проверки границ.

Мой вопрос: почему это происходит?

Это компилируется и работает нормально:

int Array[20][20][20][20][20];

int main()
{
  return 0;
}

Компилируется, но выдает исключение переполнения стека при переносе в класс:

class Foo
{
  int Array[20][20][20][20][20];
};

int main()
{
  Foo foo;
  return 0;
}

Я пытался изменить размер стека в параметрах компоновщика Visual Studio 2005, а также изменить параметр «Включить более крупные адреса», но, похоже, ничего не изменилось.

Ответы [ 3 ]

7 голосов
/ 03 октября 2011

Статический массив будет напрямую отображаться в памяти, а не в стеке.Переменная-член будет размещена в стеке, который по умолчанию, скорее всего, недостаточно велик.Кроме того, vector не выполняет проверку границ в operator[].

0 голосов
/ 03 октября 2011

Так как это исправить? Создайте свой объект как указатель или создайте хранилище внутри объекта как указатель.

std::auto_ptr<Foo> foo(new Foo);
0 голосов
/ 03 октября 2011

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

...