我主要关心缩小这样一个数组的可行性。
我正在开发一个项目,其中我使用单个malloc()调用来创建各自具有适度大的2D数组。(每个数组最多只有几十MiB。)问题是,在数组的生命周期内,其内容会显著缩小(超过一半)。显然,我可以在程序的生命周期内保持数组大小不变。 (在可用GiB内存的系统上仅为x MiB。)但是,我们谈论的是分配空间的一半以上在程序终止之前就处于未使用状态,并且由于我正在使用数组的方式,所有幸存下来的数据都保存在一组连续的行中(在块的开头)。如果我真的不需要它,保留所有那些RAM似乎是一种浪费。
虽然我知道realloc()可以用于缩小动态创建的数组,但2D数组更加复杂。我认为我理解它的内存布局(因为我实现了构造它的函数),但这将推动我的语言和编译器工作原理的理解的极限。显然,我必须处理行(并处理行指针),而不仅仅是字节,但我不知道所有这些的结果有多可预测。
是的,我需要使用单个malloc()创建数组。涉及的对象有数百万行。我尝试使用循环单独malloc()每一行,但程序总是在大约100,000次malloc()处冻结。
背景:我用来构建这些数组的源代码如下:
我正在开发一个项目,其中我使用单个malloc()调用来创建各自具有适度大的2D数组。(每个数组最多只有几十MiB。)问题是,在数组的生命周期内,其内容会显著缩小(超过一半)。显然,我可以在程序的生命周期内保持数组大小不变。 (在可用GiB内存的系统上仅为x MiB。)但是,我们谈论的是分配空间的一半以上在程序终止之前就处于未使用状态,并且由于我正在使用数组的方式,所有幸存下来的数据都保存在一组连续的行中(在块的开头)。如果我真的不需要它,保留所有那些RAM似乎是一种浪费。
虽然我知道realloc()可以用于缩小动态创建的数组,但2D数组更加复杂。我认为我理解它的内存布局(因为我实现了构造它的函数),但这将推动我的语言和编译器工作原理的理解的极限。显然,我必须处理行(并处理行指针),而不仅仅是字节,但我不知道所有这些的结果有多可预测。
是的,我需要使用单个malloc()创建数组。涉及的对象有数百万行。我尝试使用循环单独malloc()每一行,但程序总是在大约100,000次malloc()处冻结。
背景:我用来构建这些数组的源代码如下:
char ** alloc_2d_arr(int cnum, int rnum) {
/* ((bytes for row pointers + (bytes for data)) */
char **mtx = malloc(rnum * sizeof (char *) + rnum * cnum * sizeof (char));
/* Initialize each row pointer to the first cell of its row */
char *p = (char *) (mtx + rnum);
for (int i = 0; i < rnum; i++) {
mtx[i] = p + i * cnum;
}
return mtx;
}
realloc
不适合用于如此大的表格,可以看看“avl”和“红黑树”。 - David Ranierirealloc
保持与您的内存基础相同的区域头,而尾页被返回供其他用途使用;realloc
无法保证这一点... - WhozCraig