过度使用重新分配

时间:2018-07-10 16:51:01

标签: c memory-management realloc

在将数据读入字符串时,最好使用尽可能多的public static String reduce(String w) { // make sure w is not null if (w == null) return null; String result = Character.toString(w.charAt(0)); for (int i = 1; i < w.length(); i++) { if(w.charAt(i) != w.charAt(i - 1)) { result += w.charAt(i); } } return result; } 来获得正确的内存量,或者使用更少的realloc更好,但是可能会以未使用的内存结束?

例如,这样更好吗?

realloc

还是更好?

char c;
int count = 1;
char* s = malloc(sizeof(char));
while((c = fgetc(file)) != EOF) {
    char* snew = (char *)realloc(s, count*sizeof(char));
    if(!snew) {
        exit(1);
    }
    s = snew;
    s[count-1] = c;
    count++;
}

2 个答案:

答案 0 :(得分:4)

这些天内存充裕,因此拥有准确的内存量并不像最小化运行时间那样重要。

第二种方案通常认为是更好的选择,在这种方案中,您可以在需要更多时间的任何时候将分配的内存加倍。

答案 1 :(得分:2)

如果您具有不受限制的行长,那么后者绝对是 更好,因为构建长度为n的字符串的时间为O(n),而前者为{ {1}}由于不必要的复制。如果要减少过度分配,可以权衡较高的常量因子,例如,始终将缓冲区增加20% 1个字符。


P.S。 fgetc returns an int-否则在O(n²)未签名的平台上没有足够的内存...