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
之间唯一可测量的区别是当计数时