在堆上声明和初始化非常大的数组
Declaring and initializing very large arrays on the heap
我有一个约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帮助你处理数字。这会让事情变得更快。
- 当 95% 情况下的值为 0 或 1 时,对非常大的数组进行随机访问的任何优化
- 将一个数组的每个元素乘以另一个数组的每个元素,并对新的非常大的数组进行排序
- 在64位系统上创建一个非常大的数组的缺点是什么
- 在不进行线性搜索的情况下,在非常大的数组中找到比给定数字更小的数字
- 在堆上声明和初始化非常大的数组
- 保存值非常小的字节数组
- CIN 一个非常大的 int 数组,段故障 11
- 如何创建非常大的唯一整数数组
- 非常简单的多维数组程序打开Visual Studio JIT
- 犯了一个非常愚蠢的 C/C++ 数组/数组指针错误
- 我可以在类中声明一个非常大的数组吗,C++
- C++中非常大的数组存在内存问题
- 定义一个非常大的数组(查找表)的最佳方式是什么
- 从两个非常大的数组中查找公共元素
- c++循环中的SIGSEGV和一个非常大的数组
- 从uint8_t数组修改数据非常慢
- 如何快速初始化一个非常大的数组
- 一个非常大的数组(连续内存块)
- 在C/ c++中对非常大的静态数组进行算术运算
- 在一个非常小的数组中找到最小值