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

Declaring and initializing very large arrays on the heap

本文关键字:非常 数组 初始化 声明      更新时间:2023-10-16

我有一个约66000个元素的数组,每个元素都是积分数据类型的POD结构。这个数组是恒定的,永远不会改变,所以我最初的想法是把它作为一个恒定的全局变量。

我在一个头中声明它为extern,并在一个cpp文件中初始化它,比如(这里明显简化了):

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

在文本编辑器中进行一些编辑,使其不仅仅是一条连续的行。

--编辑:有人提醒我,全局变量当然不是堆栈分配的,所以这里的段落消失了!然而,如果我仍然希望数据在向量中呢?

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

我可以使用以下答案中的构造函数将数组本身转换为向量:如何从C样式数组初始化std::vector?

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

我想我可以创建一个带有默认构造函数的类,并在其中声明和初始化类型输出表。然后我可以在构造函数中声明向量,并用数组来构造它。类的唯一成员可能只是向量。

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

我应该摆脱它吗?尽管有很多数据,但这些数据是沿着PI=3.4的线。

您将"巨大常量数组"存储在编译大小生成的常量中的想法是可以的,我会这么做。

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

为了解决(愚蠢的)MSVC 2013编译器的限制,我会尝试这样做。

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

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

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

不太相关,因为这是一个巨大的数据量,如果可能的话,yu可以尝试研究OpenCL或CUDA之类的东西,让GPU帮助你处理数字。这会让事情变得更快。