大量访问冲突?

时间:2019-05-21 05:03:16

标签: c++ visual-studio

这是我的代码:

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 ....

一个超长号码。

1 个答案:

答案 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内存。