首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >比较C和C++中的结构

比较C和C++中的结构
EN

Stack Overflow用户
提问于 2009-06-20 02:55:01
回答 5查看 7.3K关注 0票数 1

我想比较一下C++类/结构对象。在C语言中,大多数情况下,人们通过将各个字段的大小相加来知道struct的确切大小(假设编译器不添加填充)。因此,可以在两个对象上使用memcmp()函数来非常快速地比较它们。我不确定这是否同样适用于C++。这是因为一个类也有函数定义,也许还有其他一些隐藏的东西(也许是一些RTTI信息?虚拟函数表?)

一个包含intchar成员的简单结构和一个函数的快速程序显示该结构的大小为sizeof(int)+sizeof(char)

我有一个很大的struct类,包含简单的int、char等数据类型(但数量很大)。我想时不时地比较一下对象。我不能重载==操作符,因为这将使它们逐个比较每个字段。在C语言中,我可以使用memcmp()一次性进行比较。对C++有什么建议吗?我可以直接使用memcmp()吗?我不希望memcmp()失败,因为像虚函数指针表这样的其他值是不同的(但所有字段实际上是相等的)(我使用g++)

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-06-20 03:39:50

在许多方面保持警惕……

  1. 任何填充中的值都是不确定的,因此不具有可比性。
  2. 如果您的计算机是小端的,比较整数字段将生成一个答案;如果您的计算机是大端的,则将生成另一个答案。
  3. 大多数人认为-1小于0,但memcmp()会进行逐字节无符号比较,因此会将-1视为大于0。
  4. 任何指针本质上都是不可比较的,因此无法使用memcmp().

比较D12或D13

总体而言,您正在寻求一种不合理的优化。

票数 10
EN

Stack Overflow用户

发布于 2009-06-20 03:03:03

可以将sizeof()作为结构或类。

编辑:自从我提供了上面的答案后,您的问题已经从“如何手动确定C++结构和类的大小?”到更一般的关于比较两个类的问题。

简而言之,您确实希望重载==操作符。认为它会一次一个字段地比较每个字段的想法是不正确的;您可以重载operator ==以使用您喜欢的任何算法,包括memcmp

内存中从第一个字段偏移量到最后一个字段的memcmp()应该可以正常工作。如果您将类型A的类与从A继承的另一个类B进行比较,则在类的整个占用空间上的memcmp()可能会失败,因为vtable指针可能不同。

票数 9
EN

Stack Overflow用户

发布于 2009-06-20 02:58:04

如果您的classstruct没有任何虚值,那么在C++中“将单个字段的大小相加(并假设编译器不添加填充)”与在C中一样正确(即不完全正确,因为通常会添加填充;-)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1020820

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档