如何计算C中的连续空(\ 0)字节?

时间:2012-04-01 20:00:57

标签: c memory null libc

是否有一种快速计算从C中某个(char *)指针开始的连续空字节数的方法?我目前正在使用一个紧凑的循环,它运行良好且足够快,但libc / gcc的字符串函数往往更快。

我正在寻找类似于strspn的东西,buf strspn(当然)在第一个空字节处停止,因此对此任务无用。我想你也可以说我正在寻找strlen的倒数,它会返回 null的字节数。

4 个答案:

答案 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编写 - 它们可以自由地利用特定于实现的知识。

你当然可以自己走这条路 - 但如果你拥有的已经足够快,那么便携性和可维护性成本真的值得吗?