如果传递两个相同的指针作为输入,memcmp 会做什么?
What does memcmp do if you pass two identical pointers as inputs?
我正在将两个字节数组与 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);
}
如果 "same array" 你的意思是相同的指针那么是的,这是有道理的。但是如果你想比较内容(memcmp
实现应该做什么),平等就没有意义了。
您正在使用的 memcmp
的实施也可以进行此验证。
What does memcmp do if you pass two identical pointers as inputs?
它将return 0.
will memcmp already [return early if pointers are equal]?
标准没有规定。例如,我检查过的 glibc 版本没有。
Would it make sense to write something like this
可能,如果数组足够大。
What would you consider large enough,
当您测量 memcmp_wrapper
比 memcmp
快一个与测量方差相比具有统计显着性的因素时,我会认为数组足够大。
测量的一些注意事项包括:
不同系统的大小阈值可能不同,具体取决于 CPU、缓存和内存等。有关深入讨论,请参阅 What is a "cache-friendly" code?。
还要注意,如果优化器可以在编译时证明指针的相等性,那么它可能足够聪明地完全优化 memcmp
,并且您最终可能会测量两个什么都不做的程序,所以请小心设计您的测试工具。
and why does it only make sense for that size?
分行不空闲。您可以通过不比较数组而节省的时间必须克服添加检查的费用。
由于比较数组的成本随着数组的大小而增加(线性渐近复杂度),因此必须有一些长度,在此之后任何比较都将比分支慢。
我正在将两个字节数组与 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);
}
如果 "same array" 你的意思是相同的指针那么是的,这是有道理的。但是如果你想比较内容(memcmp
实现应该做什么),平等就没有意义了。
您正在使用的 memcmp
的实施也可以进行此验证。
What does memcmp do if you pass two identical pointers as inputs?
它将return 0.
will memcmp already [return early if pointers are equal]?
标准没有规定。例如,我检查过的 glibc 版本没有。
Would it make sense to write something like this
可能,如果数组足够大。
What would you consider large enough,
当您测量 memcmp_wrapper
比 memcmp
快一个与测量方差相比具有统计显着性的因素时,我会认为数组足够大。
测量的一些注意事项包括:
不同系统的大小阈值可能不同,具体取决于 CPU、缓存和内存等。有关深入讨论,请参阅 What is a "cache-friendly" code?。
还要注意,如果优化器可以在编译时证明指针的相等性,那么它可能足够聪明地完全优化
memcmp
,并且您最终可能会测量两个什么都不做的程序,所以请小心设计您的测试工具。
and why does it only make sense for that size?
分行不空闲。您可以通过不比较数组而节省的时间必须克服添加检查的费用。
由于比较数组的成本随着数组的大小而增加(线性渐近复杂度),因此必须有一些长度,在此之后任何比较都将比分支慢。