4

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

2 回答 2

6

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

它将返回 0。

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

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

写这样的东西有意义吗

潜在地,如果阵列足够大。

你认为什么足够大,

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

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

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

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

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

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

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

于 2019-10-09T13:37:42.973 回答
1

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

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

于 2019-10-09T13:28:28.037 回答