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

15

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

Arduino bringt C ++ auf den Tisch, sodass wir stattdessen Klassen verwenden können.

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

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

und:

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

Welchen Unterschied wird dies in Bezug auf das Gedächtnis machen?

Ich sehe immer noch, dass die Strukturtechnik stark genutzt wird - warum ist das so?

Cybergibbons
quelle
5
Wenn ich mich richtig an mein C ++ erinnere, gibt es keinen Unterschied zwischen structund classaußer der Standardsichtbarkeit
Ratschenfreak
4
Ich würde davon ausgehen , structs verwendet werden , vor allem , weil die große Mehrheit der Embedded - Hardware in C codiert, so dass jeder, der wahrscheinlich viel Zeit das Schreiben von Code für kleine MCUs verbringt weiß C viel besser als C ++ und automatisch erreicht für C Idiome vor C ++ Idiome. Es ist ein Leistungsproblem des Programmierers .
Connor Wolf

Antworten:

11

Wie 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äßig öffentliche Mitglieder und Basen haben und Klassen standardmäßig private Mitglieder und Basen. Sowohl Klassen als auch Strukturen können eine Mischung aus öffentlichen und privaten Mitgliedern enthalten, Vererbung verwenden und Mitgliederfunktionen haben.

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

In Bezug auf den Arbeitsspeicher spielt der Zugriffsmodifikator keine Rolle. Angesichts der Speicherbeschränkungen des Arduino ist es weniger wahrscheinlich, dass Benutzer Klassen mit komplexen Hierarchien verwenden, bevorzugen jedoch die POD-Strukturen.

Ratschenfreak
quelle
5

Im Gegensatz zu C ist eine Instanz von a structin C ++ ein Objekt genauso wie eine Instanz von a class. Aus der Sicht des kompilierten Codes sind sie identisch. Speicherbelegung, Ausrichtung, Zugriffszeiten usw. sind exakt gleich (dh es entstehen keine Overheads).

Aus Sicht des Programmierers gibt es einen sehr kleinen Unterschied. Mitglieder von structhaben standardmäßig eine öffentliche Sichtbarkeit, während Mitglieder von standardmäßig eine classprivate Sichtbarkeit haben. Andernfalls funktionieren alle Sprachfunktionen auf beiden Systemen gleich, z. B. Konstruktoren / Destruktoren, Vererbung, Polymorphismus, Vorlagen und Überladung von Operatoren. Sie können sogar a structvon a ableiten classund umgekehrt.

Trotz der Ähnlichkeit ist es durchaus üblich, dass structBenutzer bei sehr einfachen Strukturen absichtlich a in C ++ verwenden, z. B. wenn es nur aus wenigen Datenelementen, aber keinen Funktionen besteht. A classwürde für alles Komplexere verwendet werden. 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.

Peter Bloomfield
quelle
4

Wie andere Antworten gezeigt haben, ist Ihre Leistung besonders structund classnicht unterscheidbar (es gibt geringfügige Unterschiede in den Gültigkeitsbereichen der Typnamen aufgrund der Art und Weise, wie Sie Ihre Struktur definiert haben). Die Abgrenzung in C ++ erfolgt nicht zwischen structund class, sondern zwischen Typen, die POD (einfache alte Daten) sind, und Typen, die es nicht sind, wie in dieser Diskussion erläutert .

Mikrotherion
quelle
3

Welchen Unterschied wird dies in Bezug auf das Gedächtnis machen?

Keiner. Strukturen und Klassen sind dasselbe, unterscheiden sich nur in den Schutzstufen, und durch die Instanziierung wird entweder ein 'Objekt' erstellt.

Sehen Sie immer noch die Strukturtechnik, die stark genutzt wird - warum ist das so?

Weniger tippen, wenn Sie nicht versuchen, Datenelemente auszublenden.

Schlamm
quelle
2

Beachten Sie, dass

typedef struct { ... } Foo;

ist in C ++ veraltet und sollte nur verwendet werden

struct Foo { ... };

Es ist in den Antworten nicht sehr klar, aber der andere Effekt von Strukturen ist standardmäßig die öffentliche Vererbung gegenüber der privaten Vererbung mit Klassen.

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

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

codah
quelle
Bearbeitete Frage Objekt-> Klasse.
Cybergibbons