2015-04-12 3 views
0

У меня есть массив из примерно 66 000 элементов, каждый элемент которого представляет собой структуру встроенных типов POD. Этот массив является постоянным и никогда не будет меняться, поэтому моя первоначальная мысль заключалась в том, чтобы просто ввести его в качестве постоянной глобальной переменной.Объявление и инициализация очень больших массивов на куче

Я заявил в заголовке как ехЬегп и инициализировать его в файле CPP, как (очевидно упрощена здесь):

const PODStruct bigArray[] = 
{ 
    {1,2,3,4} , {1,2,3,5} , .... 
} 

с некоторыми редактирования в текстовом редакторе, чтобы он не был просто один сплошной линией ,

--EDIT: Мне напомнили, что глобальные переменные, конечно, не распределены по стеклу, поэтому абзац, который здесь был, ушел! Однако, что, если я еще предпочел бы иметь данные в векторе?

Я думал, так как C++ 11 допускает тот же синтаксис для инициализации std :: vector, я мог бы просто использовать это с простым редактированием и вместо него иметь вектор. Тем не менее, в MSVC++ 2013, когда я пытаюсь скомпилировать его, я говорю, что я попал в пределы компилятора. Я просмотрел стандарты C++ для пределов компилятора и отклонений MSVC++ 13 от него, но ничто не казалось непосредственной причиной. Я предполагаю, что это связано с тем, как этот синтаксис списка инициализаторов фактически реализован.

я могу получить сам массив в вектор, используя конструктор в ответ здесь: How to initialize std::vector from C-style array?

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

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

Я мог бы просто объявить, что класс затем создает глобальный экземпляр, верно? Это было бы похоже на поведение, которое у меня было с глобальным массивом. Если бы я хотел уйти от этого, это лучший подход, чтобы объявить класс первым в главном, а затем передать его функциям и методам, которым нужна таблица?

Должен ли я уйти от этого? Эти данные, несмотря на многие из них, соответствуют PI = 3.4.

+0

Глобальные переменные не выделяются в стеке. Ваша озабоченность неуместна (каламбур). –

+0

Ох, конечно, это не так! Ха, это было глупо. Я собираюсь отредактировать этот вопрос, спасибо ... –

+0

@IgorTandetnik Что такое каламбур? –

ответ

0

Ваше представление об хранении вашего «огромного постоянного массива» в константе сгенерированного размера компиляции - это нормально, что бы я сделал.

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

Чтобы обойти (идиотский) предел компилятора MSVC 2013, я попытался бы.

  • Переключиться на компилятор MSVC 2010. См. Варианты сборки для вашего .cpp-файла. В MSVC 2013 вы можете установить «набор инструментов платформы» MSVC 2010.
  • Попробуйте переопределить тип данных. Например, вместо массива структур, попробуйте массив (константных) указателей на структуры. Все это также должно быть скомпилировано.

С некоторыми усилиями, скорее всего, вы сможете это сделать. Удачи.

0

Мне кажется, что вы столкнулись с неизвестным барьером размера файла на MSVC и/или на вашем компьютерном оборудовании. Попробуйте загрузить данные из внешнего файла, возможно (используя mmap(2) предпочтительно?)

Не очень важно, так как это огромный объем данных, вы можете попробовать изучить такие вещи, как OpenCL или CUDA, чтобы помочь вам хрустнуть если возможно. Это сделало бы вещи лот быстрее.

Смежные вопросы