Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如果您传递两个相同的指针作为输入,memcmp会做什么?_C++_Memcmp - Fatal编程技术网

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

C++ 如果您传递两个相同的指针作为输入,memcmp会做什么?,c++,memcmp,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);

我将双字节数组与
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的
memcmp
实现应该做什么),那么等式就没有意义了

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

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

它将返回0

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

本标准未对其进行规定。例如,我检查过的glibc的一个版本没有

写这样的东西有意义吗

如果阵列足够大,则可能发生这种情况


<> P>你认为什么足够大,

我认为,当您测量<代码> MeMCPMP*包装器< /> >要比<代码> MEMCMP 快得多,这是一个与测量方差相比有统计学意义的因素。

在众多测量因素中,一些考虑因素包括:

  • 根据CPU、缓存和内存等,不同系统的大小阈值可能不同。有关详细讨论,请参阅

  • 还要注意的是,如果优化程序可以在编译时证明指针的相等性,那么它可能足够聪明,可以完全优化
    memcmp
    ,并且您可能最终测量两个不起作用的程序,因此请谨慎地设计测试线束

为什么只有这种尺寸才有意义

这树枝不是免费的。不比较阵列可以节省的时间必须克服添加检查的开销


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

您是否通过比较相同的大缓冲区来分析它?这是您的标准库实现。也许你可以看看程序集来找到答案。我试图查找gcc的源代码,但它是一个没有实现的内部函数。我也没有描述它,因为我正在为所有的编译器寻找一个通用的答案,而在同意@FrançoisAndrieux的同时,我变得好奇并进行了研究。根据这一点,你的比较是有意义的。然而,这不是有点异国情调吗?我不喜欢这张支票。看起来它会隐藏虫子。为什么要检查数组是否等于自身。这似乎是一个更大问题的症状。我想做的是比较两块内存。这些数据块可能是相同的,也可能不是相同的单个数据块。那么,进行比较是有意义的。可以通过创建几个巨大的(例如100MB)相同数据数组,然后测量执行memcmp()所需的时间,来测试编译器的memcmp()实现是否已经做到了这一点两个不同的阵列与memcmp()所需的时间相比,一个阵列与自身相对。(注意,它只会告诉你一个MeMCPP()的实现;其他编译器的实现可能会有不同的效果)你认为什么大得多,为什么它只对这个大小有意义?是。@SteakOverflow如果数组只有8个字节,那么在检查字节相等性之前检查指针相等性将使工作量增加一倍。这并不考虑分支预测失误。经过一些基准测试后,gcc和clang似乎都使用了该快捷方式,因为它们在比较两个相同的指针时速度非常快。因此,
memcmp\u包装器
std::memcmp
之间唯一可测量的区别是当
计数时