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

问题描述

关于 C++ 中的类和结构体之间的区别,已经有几个问题了。 引用最多的差异是认可见性不同。 就连Stroustrup似乎也暗示基本没有区别。

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

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

解决方法

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

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

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

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

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

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


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

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

所以什么时候使用结构体和类完全是个人喜好。例如我在任何地方都使用 struct,因为默认情况下继承是公开的,我将公开成员放在首位。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...