0

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

我检查了glibcFree BSD LibC 实现,似乎都没有进行这种优化。

所以我检查了标准(如下):C99 的开放标准草案版本没有任何方式说明:

7.21.4.1 memcmp 函数概要

#include <string.h>
int memcmp(const void *s1, const void *s2, size_t n);

描述

memcmp 函数将 s1 指向的对象的前 n 个字符与 s2 指向的对象的前 n 个字符进行比较。

退货

memcmp 函数返回一个大于、等于或小于零的整数,相应地,因为 s1 指向的对象大于、等于或小于 s2 指向的对象

据我所知,它并没有禁止这样的“技巧”,因为仍然会得到相同的返回值。这确实是一个实现细节,AFAICT。

显然,编写这些库的人在这方面的思考比我多得多,所以可能有充分的理由不这样做。它是什么?

4

1 回答 1

1

我怀疑这是出于实用性考虑。

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

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

于 2018-05-02T06:33:38.323 回答