假设您正在使用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...
}

我在Visual C++中使用了它,以与CRT的实现进行比较。 CRT的速度比上述CRT快得多。

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

最佳答案

第一个CRT是用汇编程序直接写成。您可以在此处C:\Program Files\Microsoft Visual Studio 9.0\VC\crt\src\intel\strlen.asm看到它的源代码(这是针对VS 2008的)

关于c++ - 如何尽快实现strlen,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2372315/

10-12 21:21