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

Ste*_*low 4 c++ memcmp

我正在比较两个字节数组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);
}
Run Code Online (Sandbox Code Playgroud)

eer*_*ika 6

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

它将返回0。

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

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

写这样的东西有意义吗

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

您认为足够大,

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

在进行测量时,需要考虑以下因素:

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

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

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

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

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