C++中的巨大二维数组

And*_*drw 2 c c++ arrays

我正在研究一些执行图像处理的代码,它从原始图像文件中读取每16位并将每个块存储到一个数组中.该阵列需要1392列和1024行.我正在使用fread从原始文件中读取数据块:

    fread(&q1[0][0], sizeof(uint16_t), NUM_COLS*NUM_ROWS*sizeof(uint16_t), fp);
Run Code Online (Sandbox Code Playgroud)

这似乎一直工作到q1 [0] [280],它突然停止(280以上的值为0).

我以前直接声明了数组:

uint16_t q1[NUM_COLS][NUM_ROWS];
Run Code Online (Sandbox Code Playgroud)

但我认为它需要动态分配才能存储超过280个值,所以我重新写了它

    uint16_t** arr;
    arr= (uint16_t**) malloc(NUM_ROWS * sizeof(uint16_t *));
if (arr == NULL) {
    fprintf(stderr, "out of memory\n");

}
for(int i=0; i<NUM_ROWS; i++) {
    arr[i]= (uint16_t*) malloc(NUM_COLS * sizeof(uint16_t));
    if(arr[i] == NULL) {
        fprintf(stderr, "out of memory\n");

    }
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,这仍然停留在索引280处.任何关于它为何停止的想法(或者是否有更好的方法)?

Pot*_*ter 5

首先,最好不要假设这样的阵列太大了.您的平台很可能支持几兆字节的全局数组.真的,你根本不是在谈论一个非常大的对象.

其次,当行数在数组数组中变化时,指针数组最有用.对于图形应用程序,这将降低空间局部性并损害性能.此外,您将拨打电话,malloc并且需要free数千次,这也可以加起来.

NUM_COLS*NUM_ROWS*sizeof(uint16_t)一次读取字节的问题是图像在内存中不再是连续的; 它被划分为每行的单独内存块.为每个malloced块尝试单独的I/O操作......虽然我的建议是重新构建该块,如果它的大小确实是常量,那么将它设置为全局.