为清楚起见,我只讨论空终止字符串。
我熟悉使用strcmp在C中进行字符串比较的标准方法。但我觉得它很慢而且效率低下。
我不一定在寻找最简单的方法,但效率最高。
当底层代码保持跨平台时,是否可以进一步优化当前比较方法(strcmp)?
如果strcmp无法进一步优化,那么在没有strcmp的情况下我可以执行字符串比较的最快方法是什么?
当前用例:
引用当前的strcmp()实现:
编辑:澄清解决方案不需要修改strcmp。
编辑2:为此用例添加了特定示例。
答案 0 :(得分:4)
我担心strcmp()
的引用内容既不准确又不相关:
它不准确,因为它使用char
类型而不是C11标准中指定的unsigned char
类型来比较字符:
7.24.4比较功能
比较函数
memcmp
,strcmp
和strncmp
返回的非零值的符号由第一对字符值之间的差异符号决定(两者都被解释为unsigned char
),它们在被比较的对象中有所不同。
这是无关紧要的,因为现代编译器使用的实际实现要复杂得多,使用手工编码的汇编语言进行内联扩展。
任何通用实现都可能不太理想,特别是如果编码为跨平台保持可移植性。
如果您的计划的瓶颈是比较字符串,请参考以下几个方向。
memcmp()
代替strcmp()
。 memcmp()
比strcmp()
更简单,并且可以在已知字符串正确对齐的位置更有效地实现。编辑,如果提供了额外的信息,您可以在字符串中使用这样的结构:
typedef struct string_t {
size_t len;
size_t hash; // optional
char str[]; // flexible array, use [1] for pre-c99 compilers
} string_t;
您可以这种方式分配此结构:
string_t *create_str(const char *s) {
size_t len = strlen(s);
string_t *str = malloc(sizeof(*str) + len + 1;
str->len = len;
str->hash = hash_str(s, len);
memcpy(str->str, s, len + 1);
return str;
}
如果您可以对所有字符串使用这些 str ,则可以通过首先比较长度或哈希值来大大提高匹配效率。您仍然可以将str
成员传递给您的库函数,它正确地以空值终止。