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

Posted

技术标签:

【中文标题】结构和类,关于速度、内存或效率的用法【英文标题】:Structs and Classes, Usage regarding speed, memory or efficiency 【发布时间】:2021-07-19 22:43:19 【问题描述】:

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

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

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

【问题讨论】:

除了可见性(以及旧 msvc 的名称修改问题)之外,没有任何区别。 您回答了自己的问题; “甚至 Stroustrup 似乎也暗示基本没有区别。”。不,除了成员的默认可见性之外,结构和类完全相同。 默认可见性是被引用最多的区别,因为它是唯一的。 它是重复的,因为除了默认访问之外没有差异并不包括在性能上没有差异。也许它没有明确说明here,但 C++ 没有结构和类。 C++ 有类。 structclass 是您可以用来声明类的两个关键字。我会投票关闭作为骗子,但不想锤它...... 为什么一个 C++ 编译器会生成不同的代码?那将毫无意义。如果您使用的平台确实生成了不同的代码,请联系编译器供应商并报告错误。 【参考方案1】:

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

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

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

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

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

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


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

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

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

【讨论】:

以上是关于结构和类,关于速度、内存或效率的用法的主要内容,如果未能解决你的问题,请参考以下文章

PyTorch中,18个速度和内存效率优化技巧

PyTorch中,18个速度和内存效率优化技巧

MySQL 服务器的加快运行速度有哪些方法?

在 Django 中的大表上的内存效率(常量)和速度优化迭代

关于DM8168中移植算法速度慢效率低的新发现

boost::unordered_map 和 std::map 的对比(包括速度和内存消耗)