这是我的代码:
constexpr auto array_size = 50000000;
double M[array_size][2][20]= { };
int main()
{
for (int n = 0; n < array_size; n++)
printf("%d %f\n",n, M[n][0][0]);
}
当n打印到150左右时,该程序崩溃了。
我还在M [90]中看到异常值,就像386721638216381263812386113 ....
一个超长号码。
答案 0 :(得分:1)
Visual Studio通常不允许您分配大于0x7fffffff
个字节的数组,错误为:
error C2148: total size of array must not exceed 0x7fffffff bytes
我猜在这种情况下,有一个编译器错误会阻止检测到超大数组,并且该数组未正确初始化。
改为使用std::vector
并在堆上分配数组是可行的:
#include <stdio.h>
#include <vector>
constexpr auto array_size = 50000000;
int main()
{
std::vector < std::vector< std::vector< double > > > M( array_size, std::vector< std::vector< double > >( 2, std::vector< double >( 20 ) ) );
for (int n = 0; n < array_size; n++)
printf("%d %f\n", n, M[n][0][0]);
}
但是请注意,如果您确实确实需要一次将所有数据都存储在内存中,那么一维向量可能会更有效。这将使用最少的16GB内存。