是否有一种快速计算从C中某个(char *)指针开始的连续空字节数的方法?我目前正在使用一个紧凑的循环,它运行良好且足够快,但libc / gcc的字符串函数往往更快。
我正在寻找类似于strspn
的东西,buf strspn(当然)在第一个空字节处停止,因此对此任务无用。我想你也可以说我正在寻找strlen
的倒数,它会返回不 null的字节数。
答案 0 :(得分:3)
我不知道这种方法是否存在,但是如果你必须自己编写,你可以考虑使用(int*)
或(long*)
一起检查4或8个字节的集合。 / p>
答案 1 :(得分:2)
这个怎么样?
char* start = ...
char* act = start;
while (*act++ == 0);
ptrdiff_t nulls = (act - start) - 1;
但是,有些东西应该保证而在它到达不可用的内存之前停止
答案 2 :(得分:2)
如果你的指针是单词对齐的,你可以一次检查它是否为一个单词。
int zeros(char *p)
{
int n = 0;
if ((int)p & 1) {
if (*p)
return 0;
p++;
n++;
}
if ((int)p & 2) {
if (*(short *)p)
goto label1;
p += 2;
n += 2;
}
if ((int)p & 4) {
if (*(long *)p)
goto label2;
p += 4;
n += 4;
}
while (!*(long long *)p) {
p += 8;
n += 8;
}
if (!*(long *)p) {
p += 4;
n += 4;
}
label2:
if (!*(short *)p) {
p += 2;
n += 2;
}
label1:
if (!*p)
n++;
return n;
}
答案 3 :(得分:2)
在便携式标准C中没有更快的方法。
C编译器内置和标准库可以更快,因为它们不必用可移植的标准C编写 - 它们可以自由地利用特定于实现的知识。
你当然可以自己走这条路 - 但如果你拥有的已经足够快,那么便携性和可维护性成本真的值得吗?