【发布时间】:2018-05-17 10:55:34
【问题描述】:
我有一个关于动态内存分配的问题。
上下文:我正在编写一个程序,它读取一个单词的文本文件并计算每个单词出现的频率(每行一个单词)。
这个特定的函数读取文件,计算行数和字符数,然后动态地为字符串指针数组分配内存,该数组存储每行的字符数和字符串本身。 (其他部分与我的问题不太直接相关)。
问题:如果空间不足,我应该多久重新分配一次内存?我设置了一个常量(“memstart”)来设置初始内存分配值。在下面的代码 sn-p 中,我为每一行重新分配了“memstart”的值。如果 a 重新分配更大的内存块而不是每次将内存空间增加 1 个“变量类型”,程序会处理得更快吗?
这样的最佳做法是什么?
代码片段:
int read_alloc(FILE* fin, FILE *tmp, char **wdp, int *sz){
int line_cnt= 0, chr, let=1;
do{
chr=getc(fin);
let++;
//count characters
if(chr!=EOF){
chr=tolower(chr);
fputc(chr, tmp);
}
//convert to lcase and write to temp file
if ('\n' == chr || chr==EOF){
sz[(line_cnt)]=((let)*sizeof(char)); //save size needed to store string in array
*(wdp+(line_cnt))=malloc((let)*sizeof(char)); //allocate space for the string
if ((line_cnt-1) >= memstart){
realloc(wdp, (sizeof(wdp)*(memstart+line_cnt))); //if more space needed increase size
realloc(sz, (sizeof(sz)*(memstart+line_cnt)));
}
line_cnt++;
let=1;
}
} while (EOF != chr);
return (line_cnt);
}
【问题讨论】:
-
通常容器会以某个常数因子增长。说1.5。也就是说,每次您需要调整它的大小时 - 您都将其容量设为
1.5x的当前容量。 -
在增加分配时,一个好的一般策略是从合理大小的分配开始,并根据需要加倍。完成增长后,可以通过最终调用
realloc()将分配修剪到最终大小。 -
你应该重新分配
log的次数。 -
realloc(大小比以前大)的使用次数应至少与您打算踩过前一个大小的最后一个字节的次数一样多。再少一点,你就有麻烦了。
标签: c dynamic-memory-allocation realloc