Welche Gemeinkosten und andere Überlegungen gibt es bei der Verwendung einer Struktur gegenüber einer Klasse?

C auf eingebetteten Systemen verwendet traditionell Strukturen, um strukturierte Daten zu speichern.

Arduino bringt C ++ in die Tabelle, sodass wir Klassen verwenden können Stattdessen.

Nehmen wir an, wir haben zwei verschiedene Datenstrukturen, die als sehr ähnlich angesehen werden können:

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

und:

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

Welchen Unterschied macht dies in Bezug auf den Speicher?

Ich sehe immer noch, dass die Strukturtechnik häufig verwendet wird – warum ist das so?

Kommentare

  • , wenn ich mein C ++ korrekt zurückrufe Es gibt keinen Unterschied zwischen struct und class außer der Standardsichtbarkeit
  • Ich würde s werden hauptsächlich verwendet, weil die große Mehrheit der eingebetteten Hardware in C codiert ist. Jeder, der viel Zeit damit verbringt, Code für kleine MCUs zu schreiben, kennt C wahrscheinlich viel besser als C ++. und greift automatisch nach C-Idiomen vor C ++ – Idiomen. ' ist ein Programmierer Leistungsproblem.

Antwort

Entnommen aus der akzeptierten Antwort von Wann sollten Sie eine Klasse gegen eine Struktur in C ++ verwenden?

Der einzige Unterschied zwischen einer Klasse und einer Struktur in C ++ besteht darin, dass Strukturen standardmäßige öffentliche Mitglieder und Basen haben und Klassen standardmäßige private Mitglieder und Basen haben. Sowohl Klassen als auch Strukturen können eine Mischung aus öffentlichen und privaten Mitgliedern haben, Vererbung verwenden und Elementfunktionen haben.

Ich würde empfehlen, Strukturen als einfache alte Datenstrukturen ohne klassenähnliche Merkmale zu verwenden. und Verwenden von Klassen als aggregierte Datenstrukturen mit privaten Daten und Elementfunktionen.

Speichermäßig macht der Zugriffsmodifikator keinen Unterschied und angesichts der Speicherbeschränkungen des Arduino, Es ist weniger wahrscheinlich, dass Benutzer Klassen mit komplexen Hierarchien verwenden, sie bevorzugen jedoch die POD-Strukturen.

Antwort

Im Gegensatz zu C, einer Instanz eines struct in C ++ ist ein Objekt genauso wie eine Instanz eines class. Aus Sicht des kompilierten Codes sind sie identisch. Speichernutzung, Ausrichtung, Zugriffszeiten usw. sind genau gleich (dh es gibt keinen Overhead).

Aus Sicht des Programmierers gibt es einen sehr geringen Unterschied. Mitglieder eines struct ist standardmäßig öffentlich sichtbar, während Mitglieder eines class standardmäßig privat sichtbar sind. Andernfalls funktionieren alle Sprachfunktionen für beide gleich. B. Konstruktoren / Destruktoren, Vererbung, Polymorphismus, Vorlagen und Operatorüberladung. Sie können sogar eine struct von einer class und umgekehrt ableiten umgekehrt.

Trotz der Ähnlichkeit ist es durchaus üblich, dass Menschen in C ++ absichtlich ein struct für sehr einfache Strukturen verwenden, z wo es nur aus wenigen Datenelementen besteht, aber keine Funktionen. Ein class würde für alles Komplexere verwendet. Dies ist jedoch nur eine Frage der Konvention oder der persönlichen Präferenz und kann als subtiler Hinweis auf die beabsichtigte Komplexität der Struktur verwendet werden.

Antwort

Wie andere Antworten gezeigt haben, sind Ihre speziellen struct und class in Bezug auf die Leistung nicht zu unterscheiden (Es gibt geringfügige Unterschiede in der Bereiche der Typnamen, aufgrund der Art und Weise, wie Sie Ihre Struktur definiert haben). Die Abgrenzung in C ++ liegt nicht zwischen struct und class, sondern zwischen Typen, die POD (einfache alte Daten) sind, und Typen, die es nicht sind, wie in dieser Diskussion erläutert.

Antwort

Welchen Unterschied macht dies in Bezug auf den Speicher?

Keine. Strukturen und Klassen sind dasselbe, unterscheiden sich nur in den Schutzstufen, und durch das Instanziieren wird entweder ein „Objekt“ erstellt.

sieht immer noch, dass die Strukturtechnik häufig verwendet wird – warum ist das so?

Weniger tippen, wenn Sie “ Ich versuche nicht, Datenelemente auszublenden.

Antwort

Beachten Sie, dass

typedef struct { ... } Foo; 

ist in C ++ veraltet und Sie sollten nur

struct Foo { ... }; 

verwenden. Es ist in den Antworten nicht sehr klar, aber der andere Effekt von Strukturen ist Standardmäßig öffentliche Vererbung vs. standardmäßig private Vererbung mit Klassen.

Wie von anderen erwähnt, ist die Verwendung von struct im Allgemeinen eine Konvention für POD-Typen.

Auch technisch sollte „struct vs object“ sein „struct vs class“ (da das Instanziieren einer Struktur oder einer Klasse immer noch ein Objekt ergibt).

Kommentare

  • Bearbeitetes Fragenobjekt – > Klasse.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.