如果传递两个相同的指针作为输入,memcmp 会做什么?

What does memcmp do if you pass two identical pointers as inputs?

我正在将两个字节数组与 memcmp 进行比较(或者更确切地说,库函数会这样做)。数组可以变得比较大,很多时候其实可以是同一个数组。

写这样的东西有意义吗,或者 memcmp 已经在内部这样做了吗?

int memcmp_wrapper(const void* lhs, const void* rhs, std::size_t count) {
    if (lhs == rhs)
        return 0;
    return std::memcmp(lhs, rhs, count);
}

如果 "same array" 你的意思是相同的指针那么是的,这是有道理的。但是如果你想比较内容(memcmp实现应该做什么),平等就没有意义了。

您正在使用的 memcmp 的实施也可以进行此验证。

What does memcmp do if you pass two identical pointers as inputs?

它将return 0.

will memcmp already [return early if pointers are equal]?

标准没有规定。例如,我检查过的 glibc 版本没有。

Would it make sense to write something like this

可能,如果数组足够大。

What would you consider large enough,

当您测量 memcmp_wrappermemcmp 快一个与测量方差相比具有统计显着性的因素时,我会认为数组足够大。

测量的一些注意事项包括:

  • 不同系统的大小阈值可能不同,具体取决于 CPU、缓存和内存等。有关深入讨论,请参阅 What is a "cache-friendly" code?

  • 还要注意,如果优化器可以在编译时证明指针的相等性,那么它可能足够聪明地完全优化 memcmp,并且您最终可能会测量两个什么都不做的程序,所以请小心设计您的测试工具。

and why does it only make sense for that size?

分行不空闲。您可以通过不比较数组而节省的时间必须克服添加检查的费用。

由于比较数组的成本随着数组的大小而增加(线性渐近复杂度),因此必须有一些长度,在此之后任何比较都将比分支慢。