Hvilke utgifter og andre hensyn er det når du bruker en struktur mot en klasse?

C på innebygde systemer har tradisjonelt brukt strukturer for å holde strukturerte data.

Arduino bringer C ++ til bordet, slik at vi kan bruke klasser i stedet.

La oss si at vi har to forskjellige datastrukturer som kan betraktes som veldig like:

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

og:

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

Når det gjelder minne, hvilken forskjell vil dette utgjøre?

Jeg ser fortsatt at strukturteknikken brukes tungt – hvorfor er dette?

Kommentarer

  • hvis jeg husker C ++ riktig det er ingen forskjell mellom struct og class i tillegg til standardsynligheten
  • Jeg antar struct brukes primært fordi det store flertallet av innebygd maskinvare er kodet i C, så alle som bruker mye tid på å skrive kode for små MCUer, kjenner nok C mye bedre enn C ++, og når automatisk etter C-uttrykk før C ++ -betegnelser. Det ' sa programmerer ytelsesproblem.

Svar

Som hentet fra det aksepterte svaret fra Når skal du bruke en klasse mot en struktur i C ++?

Den eneste forskjellen mellom en klasse og en struktur i C ++ er at strukturer har standard offentlige medlemmer og baser og klasser har standard private medlemmer og baser. Både klasser og strukturer kan ha en blanding av offentlige og private medlemmer, kan bruke arv og kan ha medlemsfunksjoner.

Jeg vil anbefale å bruke strukturer som vanlig gamle datastrukturer uten noen klasselignende funksjoner, og bruke klasser som aggregerte datastrukturer med private data og medlemsfunksjoner.

Minnemessig gjør tilgangsmodifikatoren ingen forskjell og gitt minnebegrensningene til Arduino, folk bruker mindre klasser med komplekse hierarkier, men foretrekker POD-strukturer uansett.

Svar

I motsetning til C, en forekomst av en struct i C ++ er et objekt på nøyaktig samme måte som en forekomst av en class. Fra synspunktet til den kompilerte koden er de identiske. Minnebruk, justering, tilgangstider osv. Er nøyaktig den samme (dvs. det er ingen overhead).

Fra programmererens synspunkt er det en veldig liten forskjell. Medlemmer av en struct har offentlig synlighet som standard, mens medlemmer av class har privat synlighet som standard. Ellers fungerer alle språkfunksjonene likt på begge, slik som konstruktører / destruktorer, arv, polymorfisme, maler og operatøroverbelastning. Du kan til og med utlede en struct fra en class, og vice versa.

Til tross for likheten, er det ganske vanlig å se folk bevisst bruke en struct i C ++ for veldig enkle strukturer, f.eks. der den bare består av noen få data-medlemmer, men ingen funksjoner. En class vil bli brukt til noe mer komplisert. Dette er bare et spørsmål om konvensjon eller personlig preferanse, og kan brukes som en subtil indikasjon på strukturen som er ment kompleksiteten.

Svar

Som andre svar har påpekt, er din spesifikke struct og class umulig å skille mellom ytelse (Det er små forskjeller i omfanget av typenavnene, på grunn av måten du definerte strukturen din på. Avgrensningen i C ++ er ikke mellom struct og class mellom typer som er POD (vanlig gamle data) og typer som ikke er, som forklart i denne diskusjonen .

Svar

Når det gjelder minne, hvilken forskjell vil dette utgjøre?

Ingen. Strenger og klasser er det samme, de skiller seg bare i beskyttelsesnivåer, og instantiering skaper enten et «objekt».

ser fremdeles strukturteknikken som brukes tungt – hvorfor er dette?

Mindre å skrive hvis du » prøver ikke å skjule datamedlemmer.

Svar

Merk at

typedef struct { ... } Foo; 

er foreldet i C ++, og du bør bare bruke

struct Foo { ... }; 

Det er ikke veldig klart i svarene, men den andre effekten av strukturer er offentlig arv som standard vs privat arv som standard med klasser.

Som nevnt av andre, er bruk av struct generelt en konvensjon for POD-typer.

Også teknisk bør «struct vs object» være «struct vs class» (som å instantiere en struct eller en klasse fremdeles gir et objekt).

Kommentarer

  • Redigert spørsmålsobjekt- > klasse.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *