gpt4 book ai didi

c++ - 如何比较 POD 类型的对象

转载 作者:IT老高 更新时间:2023-10-28 22:36:33 25 4
gpt4 key购买 nike

这个例子:

#include <iostream>
#include <cstring>

struct A
{
int a;
bool b;
};

bool foo( const A a1, const A a2 )
{
return ( 0 == std::memcmp( &a1, &a2, sizeof( A ) ) );
}

int main()
{
A a1 = A();
a1.a = 5;a1.b = true;
A a2 = A();
a2.a = 5;a2.b = true;

std::cout<<std::boolalpha << foo( a1, a2 ) << std::endl;
}

由于填充,将产生 false

我无权访问 foo 函数,也无法更改比较的方式。

假设 bool 占用 1 个字节(在我的系统上是这样),如果我将 struct A 更改为:

struct A
{
int a;
bool b;
char dummy[3];
};

然后它在我的系统上运行良好(输出为 true)。

我还能做些什么来解决上述问题(获取 true 输出)?

最佳答案

由于结构中的填充,第一个不起作用。两个对象的填充具有不同的位模式。

如果您使用 memset在使用它之前设置对象中的所有位,然后它将起作用:

A a1;
std::memset(&a1, 0, sizeof(A));
a1.a = 5;a1.b = true;

A a2;
std::memset(&a2, 0, sizeof(A));
a2.a = 5;a2.b = true;

在线演示:


顺便说一下,你可以写operator< , operator==等等,也适用于 POD。

关于c++ - 如何比较 POD 类型的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6531774/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com