Welke overheadkosten en andere overwegingen zijn er bij het gebruik van een struct versus een klasse?

C op embedded systemen gebruikt traditioneel structs om gestructureerde gegevens vast te houden.

Arduino brengt C ++ naar de tabel, zodat we klassen kunnen gebruiken in plaats daarvan.

Laten we zeggen dat we twee verschillende datastructuren hebben die als zeer vergelijkbaar kunnen worden beschouwd:

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

en:

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

In termen van geheugen, wat maakt dit uit?

Ik zie nog steeds dat de struct-techniek intensief wordt gebruikt – waarom is dit?

Opmerkingen

  • als ik me mijn C ++ correct herinner er is geen verschil tussen struct en class naast de standaard zichtbaarheid
  • Ik neem aan struct s worden voornamelijk gebruikt omdat de grote meerderheid van embedded hardware is gecodeerd in C, dus iedereen die veel tijd besteedt aan het schrijven van code voor kleine MCUs kent C waarschijnlijk veel beter dan C ++, en bereikt automatisch C-idiomen vóór C ++-idiomen. Het ' is een programmeur prestatieprobleem.

Antwoord

Zoals overgenomen uit het geaccepteerde antwoord van Wanneer moet je een klasse versus een struct in C ++ gebruiken?

Het enige verschil tussen een klasse en een struct in C ++ is dat structs standaard openbare leden hebben en bases en klassen standaard privéleden en bases. Zowel klassen als structs kunnen een combinatie van publieke en private leden hebben, kunnen overerving gebruiken en kunnen lidfuncties hebben.

Ik zou aanraden om structs te gebruiken als gewoon-oude-datastructuren zonder enige klasse-achtige functies, en klassen gebruiken als geaggregeerde datastructuren met privégegevens en lidfuncties.

Geheugengewijs maakt de toegangsmodificator geen verschil en gezien de geheugenbeperkingen van de Arduino, mensen gebruiken minder vaak klassen met complexe hiërarchieën, maar geven toch de voorkeur aan de POD-structuren.

Answer

In tegenstelling tot C, een instantie van een struct in C ++ is een object op precies dezelfde manier als een instantie van een class. Vanuit het oogpunt van de gecompileerde code zijn ze identiek. Geheugengebruik, uitlijning, toegangstijden enz. Zijn exact hetzelfde (dwz er zijn geen overheadkosten).

Vanuit het oogpunt van de programmeur is er een heel klein verschil. Leden van een struct hebben standaard openbare zichtbaarheid, terwijl leden van een class standaard privé-zichtbaarheid hebben. Anders werken alle taalfuncties op beide hetzelfde, zoals constructors / destructors, overerving, polymorfisme, sjablonen en overbelasting van operators. U kunt zelfs een struct afleiden uit een class, en vice versa.

Ondanks de gelijkenis is het vrij normaal dat mensen opzettelijk een struct gebruiken in C ++ voor zeer eenvoudige structuren, bijv. waar het slechts uit een paar gegevensleden bestaat, maar geen functies. Een class zou worden gebruikt voor alles wat complexer is. Dit is echter puur een kwestie van afspraak of persoonlijke voorkeur, en kan worden gebruikt als een subtiele indicatie van de beoogde complexiteit van de structuur.

Answer

Zoals andere antwoorden hebben aangegeven, zijn uw specifieke struct en class qua prestaties niet te onderscheiden (er zijn kleine verschillen in de bereiken van de typenamen, vanwege de manier waarop u uw structuur heeft gedefinieerd). De afbakening in C ++ is niet tussen struct en class, maar tussen typen die POD (gewone oude gegevens) zijn en typen die dat niet zijn, zoals uitgelegd in deze discussie .

Answer

Wat maakt dit uit in termen van geheugen?

Geen. Structuren en klassen zijn hetzelfde, verschillen alleen in beschermingsniveaus, en het instantiëren van beide creëert een “object”.

zie nog steeds dat de struct-techniek intensief wordt gebruikt – waarom is dit?

Minder typen als je ” probeer niet om gegevensleden te verbergen.

Antwoord

Merk op dat

typedef struct { ... } Foo; 

is verouderd in C ++ en je zou gewoon

struct Foo { ... }; 

moeten gebruiken. Het is niet erg duidelijk in de antwoorden, maar het andere effect van structs is standaard openbare overerving versus standaard privé-overerving met klassen.

Zoals door anderen is vermeld, is het gebruik van struct over het algemeen een conventie voor POD-typen.

Ook technisch gezien zou “struct vs object” moeten zijn “struct vs class” (aangezien het instantiëren van een struct of een class nog steeds een object oplevert).

Opmerkingen

  • Bewerkt vraagobject- > class.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *