使用结构和类时有哪些开销和其他注意事项?


17

嵌入式系统上的C传统上使用结构来保存结构化数据。

Arduino将C ++引入了表格,因此我们可以改用类。

假设我们有两个不同的数据结构,可以认为它们非常相似:

typedef struct 
{
    int valueOne;
    int valueTwo;
    int valueThree;
} value_t;

和:

class Value
{
    public:
        int valueOne;
        int valueTwo;
        int valueThree;
}

在内存方面,这会有什么不同?

我仍然看到大量使用struct技术-为什么这样做?


5
如果我还记得我的C ++正确的有什么区别structclass除了默认的可见性
棘轮怪胎

4
我会假设structs的主要使用,因为伟大的大多数嵌入式硬件中C的编码,因此任何人谁花了很多时间编写代码为小型微控制器可能知道Ç更好然后是C ++,并自动到达了之前C ++成语英汉习语。这是程序员的性能问题。
康纳·沃尔夫

Answers:


13

摘自《何时应该在C ++中使用类与结构》一书中的公认答案

C ++中的类和结构之间的唯一区别是,结构具有默认的公共成员和基数,而类具有默认的私有成员和基数。类和结构都可以包含公共成员和私有成员,可以使用继承,还可以具有成员函数。

我建议将结构用作没有任何类功能的纯旧数据结构,并建议将类用作具有私有数据和成员函数的聚合数据结构。

在内存方面,访问修饰符没有任何区别,并且鉴于Arduino的内存限制,人们使用具有复杂层次结构的类的可能性较小,但无论如何都更喜欢POD结构。


6

与C不同,structC ++中的a实例是与a实例完全相同的对象class。从编译代码的角度来看,它们是相同的。内存使用,对齐,访问时间等完全相同(即没有开销)。

从程序员的角度来看,只有很小的区别。成员的struct默认情况下具有公共可见性,而成员的class默认情况下具有私有可见性。否则,所有语言功能在两者上的作用都相同,例如构造函数/析构函数,继承,多态性,模板和运算符重载。您甚至可以struct从导出a class,反之亦然。

尽管有相似之处,但人们经常看到人们故意struct在C ++中使用a 来实现非常简单的结构,例如,它仅由几个数据成员组成,而没有功能。A class将用于任何更复杂的事情。但是,这纯粹是出于惯例或个人喜好,可以用作结构预期复杂性的微妙指示。


4

至于其他的答案已经指出的那样,你的特殊structclass难以区分性能明智的(还有在类型名称的范围因您定义你的结构方式略有差别)。C ++中的描述不是在struct和之间class,而是在POD(普通旧数据)类型和非POD类型之间,如本讨论所述


3

在内存方面,这会有什么不同?

没有。结构和类是同一件事,仅在保护级别上有所不同,实例化任何一个都会创建一个“对象”。

仍然看到大量使用的struct技术-为什么呢?

如果您不打算隐藏数据成员,则减少键入。


2

注意

typedef struct { ... } Foo;

在C ++中已过时,您应该只使用

struct Foo { ... };

答案中不是很清楚,但结构的其他效果是默认情况下是公共继承,而类是默认是私有继承。

正如其他人所提到的,使用struct通常是POD类型的约定。

同样,从技术上讲,“结构与对象”应该是“结构与类”(因为实例化结构或类仍会提供对象)。


编辑问题对象->类。
Cyber​​gibbons 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.