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

Declaring and initializing very large arrays on the heap

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

我在 header 中将其声明为 extern 并在 cpp 文件中将其初始化,例如(此处明显简化):

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

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

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

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

我可以使用此处答案中的构造函数将数组本身变成一个向量:How to initialize std::vector from C-style array?

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

我想我可以创建一个带有默认构造函数的 class,然后在其中声明和初始化 typed-out table。然后我可以在构造函数中声明向量并用数组构造它。 class 的唯一成员可能只是向量。

我可以声明 class 然后创建它的全局实例,对吗?这类似于我对全局数组的行为。如果我想摆脱这种情况,最好的方法是先在 main 下声明 class,然后将其传递给需要 table?

的函数和方法

我应该摆脱它吗?尽管有很多数据,但这些数据还是符合 PI = 3.4.

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

不太相关,因为这是大量数据,您可以尝试查看 OpenCL 或 CUDA 之类的东西,让 GPU 在可能的情况下帮助您处理这些数字。它会使事情变得很多

关于将 "huge constant array" 存储在编译大小生成的常量中的想法没问题,我会这样做。

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

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

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

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