为什么memcmp(a, b, size)比这快得多:
for(i = 0; i < nelements; i++) {
    if a[i] != b[i] return 0;
}
return 1;
memcmp是CPU指令还是什么?它必须非常深,因为我memcmp在循环中使用了大量的加速.
前提条件:考虑这样的类或结构T,对于两个对象a和b类型T
memcmp(&a, &b, sizeof(T)) == 0
产生与...相同的结果
a.member1 == b.member1 && a.member2 == b.member2 && ...
(memberN是一个非静态成员变量T).
问题:何时应该memcmp用于比较a和b平等,何时应该使用链式==?
这是一个简单的例子:
struct vector
{
    int x, y;
};
超载运营商==的vector,有两种可能性(如果他们保证给相同的结果):
bool operator==(vector lhs, vector rhs)
{ return lhs.x == rhs.x && lhs.y == rhs.y; }
要么
bool operator==(vector lhs, vector rhs)
{ return memcmp(&lhs, &rhs, sizeof(vector)) == 0; …我想以通用的方式比较结构,我已经做了这样的事情(我不能分享实际的来源,所以如果有必要,请询问更多细节):
template<typename Data>
bool structCmp(Data data1, Data data2)
{
  void* dataStart1 = (std::uint8_t*)&data1;
  void* dataStart2 = (std::uint8_t*)&data2;
  return memcmp(dataStart1, dataStart2, sizeof(Data)) == 0;
}
这主要按预期工作,但有时即使两个 struct 实例具有相同的成员(我已经使用 eclipse 调试器进行了检查),它也会返回 false。经过一番搜索,我发现memcmp由于使用的结构被填充,这可能会失败。
有没有更合适的方法来比较对填充无动于衷的内存?我无法修改使用的结构(它们是我正在使用的 API 的一部分),并且使用的许多不同结构具有一些不同的成员,因此无法以通用方式单独比较(据我所知)。
编辑:不幸的是,我被 C++11 困住了。应该早点提到这个...
特别是,以下定义明确,还是表现出未定义的行为?
memcmp(0, 0, 0);
这在C和C++之间有区别吗?理想情况下,请提供标准报价.
如果我有两个C结构初始化为具有相同的成员,我可以保证:
memcmp(&struct1, &struct2, sizeof(my_struct))
永远都会归零?
如果我有两个byte[]数组,是否有一个内置函数来比较它们ala C memcmp()?
我正在研究一些具有高级接口的低级代码,并且需要比较运算符来进行普通旧数据类型(如FILETIME struct)的单元测试,但由于C++甚至不提供成员比较,所以我写了这样的:
template <typename Type>
std::enable_if_t<std::is_pod<Type>::value, bool> operator==(const Type& a,
                                                            const Type& b) {
  return std::memcmp(&a, &b, sizeof(Type)) == 0;
}
所以我的问题是,这是一个好方法还是有一些隐藏的恶魔会让我在开发周期后期遇到麻烦,但它现在有点工作.
如何检查C++类型是否可以轻易复制?我有一个类,它使用具有指定模板类型T的memcpy和memcmp函数,我想为类型启动断言,使用memcpy复制是不安全的.有没有办法(使用现有标准)?
我使用该memcmp函数比较了两个字符串文字.
#include <stdio.h>
#include <string.h>
int main() 
{
  char str1[] = "abcd";
  char str2[] = "ab";
  if (memcmp(str1, str2, 4) == 0) 
  {
    printf("equal string\n");
  }
  return 0;
}
在上面的程序中,str2比较短str1.这意味着str2访问字符串超出范围.
那么,这是不确定的行为吗?
有一种通过导入所述比较在.net两字节阵列的公知效率memcmp从功能msvcrt.dll,如所描述这里.
单声道中是否有等效的库导入?在linux或Windows上运行mono时需要有所不同吗?或者是否有另一种快速字节数组比较技术在单声道中运行良好?我正在寻找比在c#中迭代数组更好的东西.
更新
根据Matt Patenaude的评论,我认为这可能会很好:
#if __MonoCS__
    [DllImport("c", CallingConvention = CallingConvention.Cdecl)]
#else
    [DllImport("msvcrt.dll", CallingConvention = CallingConvention.Cdecl)]
#endif
    public static extern int memcmp(byte[] b1, byte[] b2, UIntPtr count);
但我还没有尝试过.我以前从未在单声道上进行p/invoke.我正在使用pinvoke.net上推荐的签名.这会兼容吗?
寻找以单调为重点的答案.谢谢.
memcmp ×10
c ×6
c++ ×5
struct ×2
templates ×2
bytearray ×1
c# ×1
java ×1
libc ×1
memcpy ×1
memory ×1
mono ×1
optimization ×1
padding ×1
performance ×1
posix ×1
type-traits ×1
visual-c++ ×1