标签: memcmp

为什么memcmp比for循环检查快得多?

为什么memcmp(a, b, size)比这快得多:

for(i = 0; i < nelements; i++) {
    if a[i] != b[i] return 0;
}
return 1;
Run Code Online (Sandbox Code Playgroud)

memcmp是CPU指令还是什么?它必须非常深,因为我memcmp在循环中使用了大量的加速.

c optimization performance memcmp

28
推荐指数
1
解决办法
1万
查看次数

当两者都给出相同的结果时,我应该使用memcmp或链式等于操作吗?

前提条件:考虑这样的类或结构T,对于两个对象ab类型T

memcmp(&a, &b, sizeof(T)) == 0
Run Code Online (Sandbox Code Playgroud)

产生与...相同的结果

a.member1 == b.member1 && a.member2 == b.member2 && ...
Run Code Online (Sandbox Code Playgroud)

(memberN是一个非静态成员变量T).

问题:何时应该memcmp用于比较ab平等,何时应该使用链式==


这是一个简单的例子:

struct vector
{
    int x, y;
};
Run Code Online (Sandbox Code Playgroud)

超载运营商==vector,有两种可能性(如果他们保证给相同的结果):

bool operator==(vector lhs, vector rhs)
{ return lhs.x == rhs.x && lhs.y == rhs.y; }
Run Code Online (Sandbox Code Playgroud)

要么

bool operator==(vector lhs, vector rhs)
{ return memcmp(&lhs, &rhs, sizeof(vector)) == 0; …
Run Code Online (Sandbox Code Playgroud)

c++ memcmp

23
推荐指数
3
解决办法
4875
查看次数

如何比较 C++ 中的泛型结构?

我想以通用的方式比较结构,我已经做了这样的事情(我不能分享实际的来源,所以如果有必要,请询问更多细节):

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;
}
Run Code Online (Sandbox Code Playgroud)

这主要按预期工作,但有时即使两个 struct 实例具有相同的成员(我已经使用 eclipse 调试器进行了检查),它也会返回 false。经过一番搜索,我发现memcmp由于使用的结构被填充,这可能会失败。

有没有更合适的方法来比较对填充无动于衷的内存?我无法修改使用的结构(它们是我正在使用的 API 的一部分),并且使用的许多不同结构具有一些不同的成员,因此无法以通用方式单独比较(据我所知)。

编辑:不幸的是,我被 C++11 困住了。应该早点提到这个...

c++ templates struct padding memcmp

14
推荐指数
3
解决办法
1932
查看次数

我可以将空指针传递给memcmp吗?

特别是,以下定义明确,还是表现出未定义的行为?

memcmp(0, 0, 0);
Run Code Online (Sandbox Code Playgroud)

这在C和C++之间有区别吗?理想情况下,请提供标准报价.

c c++ memcmp

13
推荐指数
1
解决办法
3432
查看次数

C结构的内部一致性

如果我有两个C结构初始化为具有相同的成员,我可以保证:

memcmp(&struct1, &struct2, sizeof(my_struct))
Run Code Online (Sandbox Code Playgroud)

永远都会归零?

c struct memcmp

11
推荐指数
2
解决办法
303
查看次数

相当于Java中的memcmp()?

如果我有两个byte[]数组,是否有一个内置函数来比较它们ala C memcmp()

c java posix libc memcmp

9
推荐指数
2
解决办法
6126
查看次数

重载operator == for pods

我正在研究一些具有高级接口的低级代码,并且需要比较运算符来进行普通旧数据类型(如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;
}
Run Code Online (Sandbox Code Playgroud)

所以我的问题是,这是一个好方法还是有一些隐藏的恶魔会让我在开发周期后期遇到麻烦,但它现在有点工作.

c++ memory templates memcmp template-meta-programming

9
推荐指数
1
解决办法
312
查看次数

C++ is_trivially_copyable检查

如何检查C++类型是否可以轻易复制?我有一个类,它使用具有指定模板类型T的memcpy和memcmp函数,我想为类型启动断言,使用memcpy复制是不安全的.有没有办法(使用现有标准)?

c++ memcpy type-traits memcmp visual-c++

8
推荐指数
2
解决办法
1917
查看次数

使用memcmp比较两个字符串文字

我使用该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;
}
Run Code Online (Sandbox Code Playgroud)

在上面的程序中,str2比较短str1.这意味着str2访问字符串超出范围.

那么,这是不确定的行为吗?

c string-literals undefined-behavior memcmp language-lawyer

8
推荐指数
1
解决办法
454
查看次数

是否有一个memcmp等效于比较Mono中的字节数组?

有一种通过导入所述比较在.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);
Run Code Online (Sandbox Code Playgroud)

但我还没有尝试过.我以前从未在单声道上进行p/invoke.我正在使用pinvoke.net上推荐的签名.这会兼容吗?

寻找以单调为重点的答案.谢谢.

c c# mono bytearray memcmp

7
推荐指数
1
解决办法
3407
查看次数