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

最佳答案



它将返回 0。



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



可能,如果数组足够大。



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

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

  • 大小阈值在不同系统上可能不同,具体取决于 CPU、缓存和内存等。请参阅 What is a "cache-friendly" code? 以进行深入讨论。
  • 还要注意,如果优化器可以在编译时证明指针的相等性,那么它可能足够聪明,可以完全优化 memcmp,并且您最终可能会测量两个什么都不做的程序,因此请谨慎设计您的测试工具。



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

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

    关于c++ - 如果将两个相同的指针作为输入传递, memcmp 会做什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58305215/

    10-11 15:54