MAX 16的strlen使用按位运算符来表示字符串

fab*_*ioM 10 c c++ string algorithm

挑战在于找到使用C中的按位运算在C/C++中确定c-string长度的最快方法.

char thestring[16];
Run Code Online (Sandbox Code Playgroud)

c-string的最大大小为16个字符,位于缓冲区内.如果字符串等于16个字符,则末尾没有空字节.

我相信可以做到,但还没有做到.

我目前正在研究这个问题,但假设字符串是在零填充缓冲区上进行memcpied .

len =   buff[0] != 0x0 +
            buff[1] != 0x0 +
            buff[2] != 0x0 +
            buff[3] != 0x0 +
            buff[4] != 0x0 +
            buff[5] != 0x0 +
            buff[6] != 0x0 +
            buff[7] != 0x0 +
            buff[8] != 0x0 +
            buff[9] != 0x0 +
            buff[10] != 0x0 +
            buff[11] != 0x0 +
            buff[12] != 0x0 +
            buff[13] != 0x0 +
            buff[14] != 0x0 +
            buff[15] != 0x0;
Run Code Online (Sandbox Code Playgroud)

注意:缓冲区为零填充 "\ 0123456789abcde"不可能发生.

N 1*_*1.1 4

这会工作得很好,因为buf初始化为零。您的解决方案!=将使用跳转指令。如果 GPU 有多个 XOR 单元,则可以很好地对以下代码进行流水线处理。另一方面,JUMP指令会导致管道的刷新。

len = !!buf[0] +
      !!buf[1] +
      //...
      !!buf[15]
Run Code Online (Sandbox Code Playgroud)

更新:当带有标志的 GCC 编译时,上面的代码和 OP 的代码产生相同的汇编代码-O3。(如果没有提供优化标志则不同)