如何尽快实现strlen

met*_*eta 8 c++ algorithm

假设您正在使用x86 32位系统.您的任务是尽快实现strlen.

你需要注意两个问题:1.地址对齐.2.读取机器字长(4字节)的存储器.

在给定的字符串中找到第一个对齐地址并不难.

然后我们可以用4个字节读取一次内存,并计算总长度.但是,一旦在4个字节中有一个零字节,我们应该停止,并在零字节之前计算左字节.为了快速检查零字节,glibc提供了一个代码片段:

unsigned long int longword, himagic, lomagic;
himagic = 0x80808080L;  
lomagic = 0x01010101L;

// There's zero byte in 4 bytes.
if (((longword - lomagic) & ~longword & himagic) != 0) {
    // do left thing...
}
Run Code Online (Sandbox Code Playgroud)

我在Visual C++中使用它,与CRT的实现进行比较.CRT比上面的快得多.

我不熟悉CRT的实现,他们是否使用更快的方法来检查零字节?

Sjo*_*erd 8

您可以在创建字符串时将字符串的长度与字符串一起保存,就像在Pascal中一样.

  • +1我不确定这是否解决了这个问题,但是,严重的是,以空字符结尾的字符串是C语言的最大弱点之一,并导致使用天真代码的大O性能时间荒谬.最好完全避免它们. (4认同)

And*_*rey 7

第一个CRT是直接用汇编语言编写的.你可以在这里看到它的源代码C:\Program Files\Microsoft Visual Studio 9.0\VC\crt\src\intel\strlen.asm(这是VS 2008)