在堆上声明并初始化非常大的数组

时间:2015-04-12 03:50:43

标签: c++ arrays vector allocation

我有一个大约66,000个元素的数组,每个元素都是整数数据类型的POD结构。这个数组是常量并且永远不会改变,所以我最初的想法就是把它作为一个常量的全局变量。

我在标题中将其声明为extern并在cpp文件中初始化,就像(显然在这里简化):

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

在文本编辑器中进行一些编辑,因此它不仅仅是一个连续的行。

- 编辑:我被提醒全局变量当然不是堆栈分配的,所以这里的段落消失了!但是,如果我仍然希望将数据放在向量中,该怎么办?

我在想,因为C ++ 11允许std :: vector初始化使用相同的语法,我可以通过简单的编辑使用它,而不是使用向量。但是,在MSVC ++ 2013中,当我尝试编译它时说我已达到编译器限制。我查看了C ++标准中的编译器限制和MSVC ++ 13与它的偏差,但似乎没有任何直接原因。我猜这与初始化列表语法的实际实现方式有关。

我可以使用答案中的构造函数将数组本身放入向量中:How to initialize std::vector from C-style array?

然而,那时我仍然有两次内存中的数组,对吧?它不像我最初担心的那样堆栈,而不是那么大,所以这不是一个大问题,但似乎是一个草率的解决方案。

我想我可以创建一个带有默认构造函数的类,并在那里声明并初始化typed-out表。然后我可以在构造函数中声明向量并使用数组构造它。该班唯一的成员可能只是矢量。

我可以声明该类然后创建它的全局实例,对吧?这与我对全局数组的行为类似。如果我想摆脱这种情况,最好的方法是在main下声明类的第一个东西,然后将它传递给需要该表的函数和方法吗?

我是否应该远离那个?尽管有很多这样的数据,但这些数据与PI = 3.4一致。

2 个答案:

答案 0 :(得分:0)

在我看来,您在MSVC和/或计算机硬件上遇到了一些未知的文件大小障碍。尝试加载外部文件中的数据(最好使用mmap(2)?)

不太相关,因为这是一个庞大的数据量,你可以尝试查看OpenCL或CUDA之类的内容,让GPU尽可能帮助你处理这些数字。它会使事情更快很多

答案 1 :(得分:0)

关于在编译大小生成的常量中存储“巨大的常量数组”的想法是可以的,这就是我要做的。

如果您尝试将所有这些移动到堆分配数组的vector或其他变体,那么您只需复制数据,因为无论如何初始化数据都驻留在可执行映像中。

解决(idiotic)MSVC 2013编译器限制,这是我尝试的。

  • 切换到MSVC 2010编译器。请参阅.cpp文件的构建选项,在MSVC 2013中,您可以设置MSVC 2010的“平台工具集”。
  • 尝试重新定义您的数据类型。例如,不要使用结构数组,而是尝试一系列(常量)指向结构的指针。所有这些都应该是编译时生成的。

通过一些努力,你很可能会解决这个问题。祝你好运。