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

如何计算C中连续的空(\0)字节数?,c,memory,null,libc,C,Memory,Null,Libc,在C语言中,有没有一种快速的方法来计算从某个char*指针开始的连续空字节数?我目前使用的是紧密循环,它运行良好,速度足够快,但libc/gcc的字符串函数往往更快 我正在寻找类似于strspn的东西,bufstrspn当然会在第一个空字节处停止,因此对这个任务没有用处。我想你也可以说我正在寻找StruLn的逆,它返回的字节数不是NULL。< /P> < P>我不知道这种方法是否存在,但是如果你必须自己编写它,你可以考虑使用4个或8个字节集合,使用一个int *或一个长*.< /p> 这是什么?

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


我正在寻找类似于strspn的东西,bufstrspn当然会在第一个空字节处停止,因此对这个任务没有用处。我想你也可以说我正在寻找StruLn的逆,它返回的字节数不是NULL。< /P> < P>我不知道这种方法是否存在,但是如果你必须自己编写它,你可以考虑使用4个或8个字节集合,使用一个int *或一个长*.< /p>

这是什么?

char* start = ...
char* act = start;
while (*act++ == 0);
ptrdiff_t nulls = (act - start) - 1; 

但是,有些东西应该保证while在到达不可用内存之前停止

如果指针是字对齐的,您可以一次检查一个字是否为零

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;
}

在可移植的标准C中,没有更快的方法来实现这一点

C编译器内置和标准库可以更快,因为它们不必用可移植的标准C编写——它们可以自由地利用特定于实现的知识


当然,你可以自己走这条路——但是如果你拥有的已经足够快了,那么它真的值得移植和维护成本吗?

如果NUL字节不是字符串的结尾,你怎么知道字符串的结尾呢?当它足够快时。。。为什么是僵尸?!在C库实现中可能有一些手工编写的汇编程序。您可以前进到最近的对齐指针,开始比较整数值。只有知道要扫描的内存长度,才有可能进行比较。@Anthales的+1-对我来说,这听起来像是过早的优化!这是一个好主意,但最终你必须衡量。通常,最简单的解决方案发现速度更快。我记得我感到惊讶的是,java jit编译器试图串联8次迭代以节省增量,结果jit使循环变慢:-代码的复杂性与其效率之间没有很强的相关性。大小和复杂度是不一样的。好主意,但我对int是4个字符长的假设感到不安,等等。int不能保证足够大以容纳指针值。使用stdint.h中的uintptr\t,或者,如果不可用,则使用size\t。@KyleJones:您可以使用sizeof检查类型大小。您还可以使用来确保代码不会在大小不同的平台上编译。@Alex我只关心指针值的底部几位,但是是的,也许我应该使用其他类型中的一种。ptrdiff\u t或size\u t但不是int。这基本上是我当前使用的紧密循环。谢谢你: