为什么在q == p的情况下,memcmp实现不是快捷方式memcmp(q,p,n)?

时间:2018-05-02 06:28:27

标签: c glibc libc memcmp

如果我传递memcmp第一个和第二个参数的等号指针, 我怀疑它可能只返回0而不检查元素 - 因为如果传递相同的指针,元素必须为零。 在我看来,检查指针相等并提前退出是一个很好的优化。

我检查了glibcFree 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。

很明显,编写这些库的人比我更加深思熟虑,所以可能有充分的理由不这样做。 它是什么?

1 个答案:

答案 0 :(得分:1)

我怀疑这是由于实际的实用问题。

在实践中,很少有人提供指向memcmp()的第一和第二个参数的相同指针,因此在大多数情况下,额外条件测试没有任何效果,因此是浪费精力。

正如Felix Palmen在评论中指出的那样,如果可以静态确认两个指针指向同一个地址,编译器可以改为进行优化。