热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

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

已经有几个问题让人们询问C++中类和结构之间的区别。引用最多的差异是默认可见性不同。甚至Stroustrup似乎也暗示基本没有区别。我认为我的问题不是重复的,因为我想

已经有几个问题让人们询问 C++ 中类和结构之间的区别。引用最多的差异是默认可见性不同。甚至 Stroustrup 似乎也暗示基本没有区别。

我认为我的问题不是重复的,因为我想问一些具体和准时的问题:针对类使用结构体在速度、内存使用或效率方面有任何影响吗?可以基于其中的任何优势来选择一个吗?

作为参考,我正在评估一个人的 C++ 代码,该代码仅使用结构体,我将把它移植到资源有限的 ARM 架构中。

回答

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

没有。没有影响。甚至没有编译时间差异。

此外,如果您想确定某事的性能影响,您应该进行测量和基准测试。如果你不这样做,你永远不会知道。在 StackOverflow 上询问并不能代替测量您自己的程序。

请注意,创建一个正确的基准来衡量正确的事情需要技巧,就像编写好的单元测试可以帮助您在不减慢速度的情况下发现错误一样。

您还可以查看编译器的汇编输出。至于我,我绝对知道两者之间没有区别,因为在我尝试的所有情况下,我都没有观察到两者之间的汇编输出有什么不同。

如果对性能和内存使用有影响,您应该向编译器实现者报告错误。


正如您现在可能知道的那样,除了可见性之外structclass它们被定义为完全相同。的sizeof一类是一样的具有相同的成员结构的大小。与包含用作基础的类型相比,您甚至可以在没有开销的情况下进行基本继承。例如,std::tuple与 struct 相比没有开销,但不能在没有继承的情况下实现。

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

所以什么时候使用 struct 和 classes 完全是个人喜好。比如我struct到处都用,因为继承默认是public的,我把public成员放在第一位。






推荐阅读
  • 数据库内核开发入门 | 搭建研发环境的初步指南
    本课程将带你从零开始,逐步掌握数据库内核开发的基础知识和实践技能,重点介绍如何搭建OceanBase的开发环境。 ... [详细]
  • 本文详细记录了在银河麒麟操作系统和龙芯架构上使用 Qt 5.15.2 进行项目打包时遇到的问题及解决方案,特别关注于 linuxdeployqt 工具的应用。 ... [详细]
  • 尽管深度学习带来了广泛的应用前景,其训练通常需要强大的计算资源。然而,并非所有开发者都能负担得起高性能服务器或专用硬件。本文探讨了如何在有限的硬件条件下(如ARM CPU)高效运行深度神经网络,特别是通过选择合适的工具和框架来加速模型推理。 ... [详细]
  • 本文提供南昌大学《嵌入式系统》课程期末考试的真题及详细解答,涵盖填空题、指令测试题等内容,帮助学生更好地理解和掌握相关知识点。 ... [详细]
  • 本文详细介绍了C语言的起源、发展及其标准化过程,涵盖了从早期的BCPL和B语言到现代C语言的演变,并探讨了其在操作系统和跨平台编程中的重要地位。 ... [详细]
  • 在进行QT交叉编译时,可能会遇到与目标架构不匹配的宏定义问题。例如,当为ARM或MIPS架构编译时,需要确保使用正确的宏(如QT_ARCH_ARM或QT_ARCH_MIPS),而不是默认的QT_ARCH_I386。本文将详细介绍如何正确配置编译环境以避免此类错误。 ... [详细]
  • 嵌入式开发环境搭建与文件传输指南
    本文详细介绍了如何为嵌入式应用开发搭建必要的软硬件环境,并提供了通过串口和网线两种方式将文件传输到开发板的具体步骤。适合Linux开发初学者参考。 ... [详细]
  • 本文详细介绍了macOS系统的核心组件,包括如何管理其安全特性——系统完整性保护(SIP),并探讨了不同版本的更新亮点。对于使用macOS系统的用户来说,了解这些信息有助于更好地管理和优化系统性能。 ... [详细]
  • 本文详细介绍了 Java 中 org.apache.xmlbeans.SchemaType 类的 getBaseEnumType() 方法,提供了多个代码示例,并解释了其在不同场景下的使用方法。 ... [详细]
  • Linux设备驱动程序:异步时间操作与调度机制
    本文介绍了Linux内核中的几种异步延迟操作方法,包括内核定时器、tasklet机制和工作队列。这些机制允许在未来的某个时间点执行任务,而无需阻塞当前线程,从而提高系统的响应性和效率。 ... [详细]
  • 本文深入探讨了C++对象模型中的一些细节问题,特别是虚拟继承和析构函数的处理。通过具体代码示例和详细分析,揭示了书中某些观点的不足之处,并提供了更合理的解释。 ... [详细]
  • 解析SQL查询结果的排序问题及其解决方案
    本文探讨了为什么某些SQL查询返回的数据集未能按预期顺序排列,并提供了详细的解决方案,帮助开发者理解并解决这一常见问题。 ... [详细]
  • 本文详细介绍了优化DB2数据库性能的多种方法,涵盖统计信息更新、缓冲池调整、日志缓冲区配置、应用程序堆大小设置、排序堆参数调整、代理程序管理、锁机制优化、活动应用程序限制、页清除程序配置、I/O服务器数量设定以及编入组提交数调整等方面。通过这些技术手段,可以显著提升数据库的运行效率和响应速度。 ... [详细]
  • 深入解析Java虚拟机(JVM)架构与原理
    本文旨在为读者提供对Java虚拟机(JVM)的全面理解,涵盖其主要组成部分、工作原理及其在不同平台上的实现。通过详细探讨JVM的结构和内部机制,帮助开发者更好地掌握Java编程的核心技术。 ... [详细]
  • 当在 Android 应用中使用 NDK 时,可能会遇到 java.lang.UnsatisfiedLinkError: Native method not found 的错误。本文将详细探讨该错误的原因及解决方案。 ... [详细]
author-avatar
股海一游6888
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有