比较C与C+中的结构+; 我想比较C++类/结构对象。在C语言中,大多数情况下,通过将各个字段的大小相加(假设编译器不添加填充),就可以知道结构的确切大小。因此,可以对两个对象使用memcmp()函数来快速比较它们。我不确定是否同样适用于C++。这是因为一个类也有函数定义,可能还有其他一些隐藏的东西(可能有一些RTTI信息?甚至是一个虚拟函数表?)
一个包含比较C与C+中的结构+; 我想比较C++类/结构对象。在C语言中,大多数情况下,通过将各个字段的大小相加(假设编译器不添加填充),就可以知道结构的确切大小。因此,可以对两个对象使用memcmp()函数来快速比较它们。我不确定是否同样适用于C++。这是因为一个类也有函数定义,可能还有其他一些隐藏的东西(可能有一些RTTI信息?甚至是一个虚拟函数表?),c++,class,C++,Class,一个包含int和char成员的简单结构的快速程序和一个函数显示结构的大小为sizeof(int)+sizeof(char) 我有一个大的struct类,包含简单的int、char等数据类型(但数量很多)。我想不时地比较对象。我不能重载==操作符,因为这将使它们逐个字段进行比较。在C语言中,我可以使用memcmp()一次性进行比较。对C++有什么建议?我可以直接使用memcmp()吗?我不希望memcmp()失败,因为像虚函数指针表这样的其他值是不同的(但所有字段实际上是相等的) (我使用g++)
int
和char
成员的简单结构的快速程序和一个函数显示结构的大小为sizeof(int)+sizeof(char)
我有一个大的struct类,包含简单的int、char等数据类型(但数量很多)。我想不时地比较对象。我不能重载==
操作符,因为这将使它们逐个字段进行比较。在C语言中,我可以使用memcmp()
一次性进行比较。对C++有什么建议?我可以直接使用memcmp()
吗?我不希望memcmp()失败,因为像虚函数指针表这样的其他值是不同的(但所有字段实际上是相等的)
(我使用g++)< p>如果你的代码>类< /COD>或
=
操作符。认为它会一次一个字段地比较每个字段是不正确的;您可以重载操作符==
以使用任何您喜欢的算法,包括memcmp
从第一个字段偏移量到最后一个字段偏移量的内存上的
memcmp()。如果将类型A的类与从A继承的另一类B进行比较,则类的整个封装外形上的memcmp()
,可能会失败,因为vtable指针可能不同 可以获取结构或类
编辑:
既然我提供了上面的答案,你就改变了你的问题,从“如何手动确定C++结构和类的大小?”到一个更一般的关于比较两个类。p>
简而言之,您确实希望重载=
操作符。认为它会一次一个字段地比较每个字段是不正确的;您可以重载操作符==
以使用任何您喜欢的算法,包括memcmp
从第一个字段偏移量到最后一个字段偏移量的内存上的memcmp()。如果将类型A的类与从A继承的另一类B进行比较,则类的整个封装外形上的memcmp()
,可能会失败,因为vtable指针可能不同 s与memcmp相比是安全的
在类对象上执行memcmp时,填充是一个问题,因为它可能会被垃圾填充(不同对象的垃圾会有所不同)。在C中,通常没有这个问题,因为在完成任何任务之前将整个结构都存储到0是完全可以的,而且C++中非常糟糕,因为您可以重写VTAB.< /P>
我不相信语言规范中有任何内容说明vtables是如何实现的,尽管它们通常是隐藏的数据成员。vtable对于同一类的成员应该是相同的(但是对于父/子类当然会有所不同)。当您进入多重继承或虚拟继承时,各个编译器的实现可能会更加不同。s与memcmp相比是安全的
在类对象上执行memcmp时,填充是一个问题,因为它可能会被垃圾填充(不同对象的垃圾会有所不同)。在C中,通常没有这个问题,因为在完成任何任务之前将整个结构都存储到0是完全可以的,而且C++中非常糟糕,因为您可以重写VTAB.< /P>
我不相信语言规范中有任何内容说明vtables是如何实现的,尽管它们通常是隐藏的数据成员。vtable对于同一类的成员应该是相同的(但是对于父/子类当然会有所不同)。当您进入多重继承或虚拟继承时,各个编译器的实现可能会更加不同。在许多方面都要小心
任何填充中的值都是不确定的,因此不可比较
如果您的机器是little endian,比较整数字段将产生一个答案;如果您的机器是big endian,它将生成另一个答案
大多数人认为-1比0小,但memcmp()
将进行字节无符号比较,因此将-1视为大于0
任何指针在memcmp()
中本质上都是不可比较的
不能使用memcmp()
比较float
或double
总的来说,您正在寻求一种不合理的优化。在许多方面都要小心
任何填充中的值都是不确定的,因此不可比较
如果您的机器是little endian,比较整数字段将产生一个答案;如果你的机器是big-e
#pragma pack(push, 1)
struct Example
{
int a;
char b;
short c;
};
#pragma pack(pop)