比较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>或Stult没有虚拟的,“添加单个字段的大小(假设编译器不添加填充)”在C++中与C一样正确(即不完全是因为填充通常是添加的;如果<>代码>类< <代码>或<代码>结构> <代码>没有虚拟的,“添加单个字段的大小(假设编译器不添加填充)”在C++中与C一样正确(即不完全是因为填充通常是添加的)。

可以使用<代码> siZeFo()/Stuts>结构或类。

编辑: 既然我提供了上面的答案,你就改变了你的问题,从“如何手动确定C++结构和类的大小?”到一个更一般的关于比较两个类。p> 简而言之,您确实希望重载
=
操作符。认为它会一次一个字段地比较每个字段是不正确的;您可以重载
操作符==
以使用任何您喜欢的算法,包括
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)