在分配之前我应该​​计算所需的内存量吗?

时间:2016-01-22 13:11:53

标签: c memory memory-management heap-memory dynamic-memory-allocation

考虑以下代码来过滤掉带有前缀的参数:

int main(int argc, char* argv[]) {
    int    i;
    int    j;
    size_t flags_len;
    char*  flags;

    flags_len = 0;
    for (i=1; i < argc; i++) {
        if (argv[i][0] == '-') {
            flags_len++;
        }
    }

    flags = malloc(flags_len);

    j = 0;
    for (i=1; i < argc; i++) {
        if (argv[i][0] == '-') {
            flags[j++] = argv[i][1];
        }
    }

    return 0;
}

为了计算标志数量,是否值得循环所有参数两次? 这样做时保存过滤元素的位置是否可行? 如果我们期望分配大量内存,是否值得呢? 什么选项一般是最佳的? (什么是最佳做法&#39;)?

  • 在分配(1来电malloc之前进行计数,大速减速)
  • 分配缓冲区(floor(n / buffersize) + 1调用malloc(或realloc),小速减速
  • 需要时分配(n来电malloc(或realloc),无额外速度损失)

2 个答案:

答案 0 :(得分:1)

恕我直言,您没有指定您期望的参数数量。如果你期望成千上万的争论,肯定不会成为瓶颈。记住,机器正在做这项工作,而不是你。

在这种情况下,分配和重新分配的效率低于两个循环。此外,如果你害怕双循环,你总是可以分配flags=malloc(argc)

Chars很便宜。我会做这样的事情,

flag = malloc(argc);
//your code
if(argv[i][0]=='-')
flags[j++] = argv[i][1];

为什么呢?保存我两个循环,并将比较减半。 :)

答案 1 :(得分:-2)

这未经过测试 - 但是这样的事情更加怀孕了!

int main(int argc, char* argv[]) {
    int    i;
    int    j;
    int flags_len;
    char*  flags;

    flags_len = 0;
    for (i=1; i < argc; i++) {
        if (argv[i][0] == '-') {
            flags = (char*) malloc((1 + flags_len)*sizeof(char));
            flags[flags_len] = argv[i][1];
            flags_len++;
        }
    }
    free(flags);
    return 0;
}