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

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

本文关键字:输入 memcmp 什么 指针 两个 如果      更新时间:2023-10-16

我正在比较两个字节数组与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);
}

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

它将返回 0。

MEMCMP 是否已经 [如果指针相等,则提前返回]?

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

写这样的东西有意义吗

如果阵列足够大,则可能。

你认为什么足够大,

当您测量memcmp_wrapper时,我认为数组足够大,比memcmp快,与测量方差相比具有统计显著性的因子。

测量的一些考虑因素包括:

  • 大小阈值在不同的系统中可能有所不同,具体取决于 CPU、缓存和内存等。请参阅什么是"缓存友好"代码?进行深入讨论。

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

为什么它只对这个尺寸有意义?

分支不是免费的。不比较阵列可以节省的时间必须克服添加检查的费用。

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

如果"相同的数组"是指相同的指针,那么是的,这是有道理的。但是,如果您想比较内容(memcmp实现应该做什么(,则相等就没有意义。

此外,您正在使用的memcmp的实现可以进行此验证。