如果我传递memcmp
第一个和第二个参数的等号指针,
我怀疑它可能只返回0而不检查元素 - 因为如果传递相同的指针,元素必须为零。
在我看来,检查指针相等并提前退出是一个很好的优化。
我检查了glibc 和Free BSD LibC 实现,似乎都没有进行此优化。
所以我检查了标准(下面): Open Standards draft version of C99没有说出任何方式:
7.21.4.1 memcmp功能概要
#include <string.h> int memcmp(const void *s1, const void *s2, size_t n);
描述
memcmp函数比较了前n个字符 s1指向对象的前n个字符 s2指出。
返回
memcmp函数返回一个大于,等于的整数, 或者小于零,因此s1指向的对象是 大于,等于或小于s2指向的对象
据我所知,它不会禁止这样的“技巧”,因为人们仍会获得相同的返回值。 它实际上是一个实现细节,AFAICT。
很明显,编写这些库的人比我更加深思熟虑,所以可能有充分的理由不这样做。 它是什么?答案 0 :(得分:1)
我怀疑这是由于实际的实用问题。
在实践中,很少有人提供指向memcmp()
的第一和第二个参数的相同指针,因此在大多数情况下,额外条件测试没有任何效果,因此是浪费精力。
正如Felix Palmen在评论中指出的那样,如果可以静态确认两个指针指向同一个地址,编译器可以改为进行优化。