考虑以下代码来过滤掉带有前缀的参数:
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
),无额外速度损失)答案 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;
}