我正在研究一些执行图像处理的代码,它从原始图像文件中读取每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处.任何关于它为何停止的想法(或者是否有更好的方法)?
首先,最好不要假设这样的阵列太大了.您的平台很可能支持几兆字节的全局数组.真的,你根本不是在谈论一个非常大的对象.
其次,当行数在数组数组中变化时,指针数组最有用.对于图形应用程序,这将降低空间局部性并损害性能.此外,您将拨打电话,malloc并且需要free数千次,这也可以加起来.
NUM_COLS*NUM_ROWS*sizeof(uint16_t)一次读取字节的问题是图像在内存中不再是连续的; 它被划分为每行的单独内存块.为每个malloced块尝试单独的I/O操作......虽然我的建议是重新构建该块,如果它的大小确实是常量,那么将它设置为全局.
| 归档时间: |
|
| 查看次数: |
460 次 |
| 最近记录: |