程序集中的字符串长度例程,用于替换C ++中的strlen

时间:2011-12-12 18:59:35

标签: c++ winapi assembly

我现在面临strlen的某些问题(在很多情况下我读取文件并且字符串不是零终止)。所以我在考虑制作一个汇编例程来计算字符串的长度。我要做的就是从字符串的末尾向后走,直到遇到我的第一个字符,然后计算字符串的长度。事实上,我在编写汇编程序时已经写过一段时间了。

现在,我想知道,我有什么理由不这样做吗?我会失去什么特别的优势?

另一个替代方法是将我的字符数组的每个成员都设为null。我可以一次4个字节组装,甚至通过简单的for循环。

请记住,我在谈论相当大的数组[64k]。由于我需要在用户选择文件时立即显示文件,因此处理速度必须非常快。

编辑: 澄清说,我知道我知道字符串的长度,我的意思是:

char* buffer = new char[length];

我知道length。但是当我填充这个缓冲区时,我不知道它具有ascii字符的确切长度。当我使用strlen时,它不会给我当前的长度。基本上length可以是500,但其中只能有5个有效字符,其余495可能是垃圾值。

1 个答案:

答案 0 :(得分:4)

  

现在,我想知道,为什么我不应该这样做?

是。如果你已经有字符串的结束字节及其开头,那么你知道它的长度:

const char *begin = //beginning.
const char *end = //last byte of string.
ptrdiff_t stringLength = (end - begin) + 1;

+1是因为end指向字符串的最后一个字节。如果end过了一个,那么您就不需要+1。没有必要按常规计算你已经知道的东西。

请注意,这假定字符串是ASCII或其他一些单字节每字符编码。如果您使用某种Unicode编码(UTF-8,UTF-16等),那么您必须扫描字符串以确定它有多少代码点。

当然,如果它是Unicode编码,则需要解决“长度”究竟是什么意思的问题。 “长度”可以是“代码点数”,“不同字母数”,甚至是“编码中代码单元数”。