memcmp传入相同指针的行为及自定义封装合理性的技术咨询
好问题!咱们一步步来拆解你的疑问:
当memcmp传入两个完全相同的指针时的行为?
根据C和C++的标准规范,当你给memcmp传入的两个指针lhs和rhs指向完全相同的内存地址时,函数必然返回0。毕竟比较的是同一块内存里的内容,每一个字节都完全一致,自然满足“相等”的条件。
顺带提一句:哪怕count参数是0,不管指针是否相同,memcmp也会返回0——不过这和你的问题场景关联不大。
编写memcmp_wrapper是否有意义?
这个得分情况看:
标准库的
memcmp是否自带指针相等检查?
不同的标准库实现(比如GNU glibc、MSVC标准库、LLVM libc等)行为不一样。有些实现会在内部先做指针相等的快速检查:如果lhs == rhs,直接返回0,跳过后续的逐字节比较;但**C/C标准并没有强制要求所有memcmp实现都做这个优化**。也就是说,某些小众或者特定场景下的memcmp可能会傻乎乎地去逐字节遍历同一块内存,哪怕指针完全相同。你的wrapper的价值
如果你的业务场景里,绝大多数情况都是两个指针指向同一个大数组,那这个wrapper的价值非常大——它能直接跳过海量的字节比较操作,性能提升会很明显。反之,如果指针相等的情况很少见,那这个额外的指针比较带来的开销几乎可以忽略,写了也没什么坏处。另外,你的wrapper不需要处理
count == 0的情况:因为即使lhs != rhs,memcmp在count为0时也会返回0,和你wrapper的逻辑结果一致。
总结一下:如果你的场景里指针相等是高频情况,这个wrapper很值得写;如果只是偶尔出现,写不写都行,但写了也不会有副作用。
内容的提问来源于stack exchange,提问作者SteakOverflow

