当前位置: 首页 > 知识库问答 >
问题:

结构和类,关于速度、内存或效率的用法

索令
2023-03-14

关于C++中的类和结构之间的区别,人们已经问了几个问题。引用最多的区别是缺省可见性不同。就连斯特鲁斯特鲁普似乎也在暗示,基本上没有什么区别。

我认为我的问题不是重复的,因为我想问一些具体而及时的问题:使用结构来对付类在速度、内存使用或效率方面是否有任何影响?偏爱一个而不是另一个能基于那些东西的任何优点吗?

作为参考,我正在评估一个人专门使用结构的C++代码,并将其移植到一个资源有限的ARM体系结构。

共有1个答案

逄岳
2023-03-14

针对类使用结构是否在速度、内存使用或效率方面有任何影响?

没有。没有影响。甚至不编译时差。

此外,如果您想确定某件事情的性能影响,您应该进行度量和基准测试。如果你不知道,你永远也不会知道。对StackOverflow进行询问并不能取代对您自己的程序进行测量。

请注意,创建一个正确的基准来衡量正确的事情需要一些技巧,就像编写好的单元测试来帮助您发现bug,而不会拖慢您的速度一样。

您还可以查看编译器的程序集输出。至于我,我肯定知道两者之间没有区别,因为在我尝试的所有情况下,我观察到两者之间的组装输出没有区别。

如果存在性能和内存使用影响,则应该向编译器实现者报告该bug。

您现在可能已经知道,structclass被定义为除了可见性之外完全相同。类的sizeof与具有相同成员的结构的大小相同。与包含用作基的类型相比,您甚至可以在没有开销的情况下拥有基本继承。例如,std::tuple与结构相比没有开销,但如果没有继承就无法实现。

但是,只要您添加单个虚函数或虚继承,编译器就会添加一个vtable和RTTI。这是您类型中引用元数据的指针。vtable包含调用虚函数、检查向下转换和侧转换、虚拟基位置和类型ID的所有元数据。

所以什么时候使用struct和类完全是个人喜好。例如,我到处使用struct,因为默认情况下继承是public的,我将public成员放在第一位。

 类似资料:
  • 我正在用Python实现一个Trie。到目前为止,我遇到了两种不同的方法来实现它: -存储字符 -存储单词结尾(true或false) -存储具有当前前缀的单词数 我们派生出这本词典: 哪一种是高效的、标准的数据结构,既能有效地存储内存,又能快速地进行字的大数据集上的遍历和其他trie操作?

  • 本文向大家介绍Java内存结构和数据类型,包括了Java内存结构和数据类型的使用技巧和注意事项,需要的朋友参考一下 Java内存结构   内存就是暂时对数据的一个存储,他的存储速度非常的快,但是他是暂时的存储,从开机时开始存储,掉电或关机之后数据全部丢失。内存的生命周期就是开机和关机,开机的时候开始计算,关机什么都没有了。优点存储速度快,缺点容易坏掉,如果开机的时候,一点反映都没有,屏幕不亮键盘鼠

  • 我想在数据库中得到一些电子邮件,每个电子邮件都有一个状态。所有可能的状态都是一个表中的stock,在该表中它们都有权限(如show、edit、delete等)。那些电子邮件不是用户通过一个站点的权限,而是一个用户添加的电子邮件列表。 下面是表的结构: 电子邮件表 状态表 谢谢

  • 内存结构 一个C 程序本质上都是由BSS(Block Started by Symbol) 段、Data 段、Text 段三个组成的。 BSS 段:在采用段式内存管理的架构中,BSS 段(Block Started by Symbol)通常是指用来存放程序中 未初始化的全局变量的一块内存区域。BSS 是英文Block Started by Symbol 的简称。BSS 段属于静态内存 分配,即程序

  • 本文向大家介绍关于List.ToArray()方法的效率测试,包括了关于List.ToArray()方法的效率测试的使用技巧和注意事项,需要的朋友参考一下 之前一直认为因为List内部实现是数组,ToArray的实现只是将数组返回出去而已。 今天测了一下发现并不是那样 1万数量大小的List,调用1万次ToArray的时间消耗是417ms左右。 报着疑惑看了下源码,没想到它是把内部数组复制了一份再

  • 我正在开发一个应用程序,它需要每x分钟上线一次,检查一些新数据。为了防止大量的网络和数据使用,任务应该以固定的速率运行,但是这种解决方案的最佳方法是什么?< code >处理程序或< code >计时器对象?