这个字符串比较优化在规范方面有什么问题吗?

Edw*_*ers 1 c string optimization c-strings strcmp

假设没有传递小于 4 个字节的字符串,那么这种优化有什么问题吗?是的,在比较大多数不相似的字符串时,在我测试过的机器上,这是一个显着的加速。

#define STRCMP(a, b) ( (*(int32_t*)a) == (*(int32_t*)b) && strcmp(a, b) == 0)

Run Code Online (Sandbox Code Playgroud)

假设字符串不少于 4 个字节,是否有一种更快的方法可以在不诉诸汇编等的情况下做到这一点?

And*_*nle 6

除了可能违反对齐限制之外,将数组的地址转换char为 anint *并取消引用它始终是严格的别名违规。

例子

请参阅UDP 校验和计算不适用于较新版本的 gcc,这只是严格别名违规危险的一个示例。

请注意,C 实现本身可以在内部自由使用未定义的行为。实现者拥有对实现的知识和完全控制权,而使用其他人的编译器的人通常不会拥有这些知识。


MSa*_*ers 5

*(int32_t*)a假设a是 4 字节对齐。一般来说情况并非如此。

  • 请注意,如果不满足任何对齐标准,只需 `(int32_t*)a` 就足以调用未定义的行为 - [无需取消引用](https://port70.net/~nsz/c/c11/n1570.html #6.3.2.3p7):“指向对象类型的指针可以转换为指向不同对象类型的指针。如果生成的指针未针对引用类型正确对齐,则行为未定义。” (2认同)