Hvilke generalomkostninger og andre overvejelser er der, når du bruger en struct vs en klasse?

C på indlejrede systemer har traditionelt brugt strukturer til at holde strukturerede data.

Arduino bringer C ++ til bordet, så vi kan bruge klasser i stedet.

Lad os sige, at vi har to forskellige datastrukturer, der kan betragtes som meget ens:

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

og:

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

Hvad hukommelse angår, hvilken forskel vil det gøre?

Jeg ser stadig strukturen bruges meget – hvorfor er det?

Kommentarer

  • hvis jeg husker min C ++ korrekt der er ingen forskel mellem struct og class udover standardsynligheden
  • Jeg antager, at struct s bruges primært fordi det store flertal af integreret hardware er kodet i C, så enhver, der bruger meget tid på at skrive kode til små MCUer, kender sandsynligvis C meget bedre end C ++, og når automatisk efter C-udtryk før C ++ -betegnelser. Det ' er programmør ydeevneudgave.

Svar

Som taget fra det accepterede svar fra Hvornår skal du bruge en klasse vs en struktur i C ++?

Den eneste forskel mellem 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 have en blanding af offentlige og private medlemmer, kan bruge arv og kan have medlemsfunktioner.

Jeg vil anbefale at bruge strukturer som almindelig gamle datastrukturer uden nogen klasselignende funktioner, og ved hjælp af klasser som samlede datastrukturer med private data og medlemsfunktioner.

Hukommelsesmæssigt gør adgangsmodifikatoren ingen forskel og i betragtning af hukommelsesbegrænsningerne i Arduino, folk er mindre tilbøjelige til at bruge klasser med komplekse hierarkier, men foretrækker POD-strukturer alligevel.

Svar

I modsætning til C, en forekomst af en struct i C ++ er et objekt på nøjagtig samme måde som en forekomst af en class. Fra den kompilerede kodes synspunkt er de identiske. Hukommelsesforbrug, justering, adgangstider osv. Er nøjagtigt de samme (dvs. der er ingen omkostninger).

Fra programmørens synspunkt er der en meget lille forskel. Medlemmer af en struct har offentlig synlighed som standard, mens medlemmer af en class har privat synlighed som standard. Ellers fungerer alle sprogfunktioner ens på begge, såsom konstruktører / destruktorer, arv, polymorfisme, skabeloner og operatøroverbelastning. Du kan endda udlede en struct fra en class og vice versa.

På trods af ligheden er det ret almindeligt at se folk bevidst bruge en struct i C ++ til meget enkle strukturer, f.eks. hvor det kun består af et par datamedlemmer, men ingen funktioner. En class ville blive brugt til noget mere komplekst. Dette er udelukkende et spørgsmål om konvention eller personlig præference og kan bruges som en subtil indikation af strukturens tilsigtede kompleksitet.

Svar

Som andre svar har påpeget, er din særlige struct og class ikke skelne mellem ydeevne (Der er små forskelle i rækkevidden af typenavne på grund af den måde, du definerede din struktur på. Afgrænsningen i C ++ er ikke mellem struct og class mellem typer, der er POD (almindelige gamle data) og typer, der ikke er, som forklaret i denne diskussion .

Svar

Med hensyn til hukommelse, hvilken forskel vil det gøre?

Ingen. Strigter og klasser er de samme ting, de adskiller sig kun i beskyttelsesniveauer, og instantiering opretter enten et “objekt”.

ser stadig strukturteknikken blive brugt tungt – hvorfor er dette?

Mindre at skrive, hvis du ” prøver ikke at skjule datamedlemmer.

Svar

Bemærk at

typedef struct { ... } Foo; 

er forældet i C ++, og du skal bare bruge

struct Foo { ... }; 

Det er ikke meget klart i svarene, men den anden effekt af structs er offentlig arv som standard versus privat arv som standard med klasser.

Som nævnt af andre er brug af struct generelt en konvention for POD-typer.

Også teknisk skal “struct vs object” være “struct vs class” (som instantiering af en struct eller en klasse giver stadig et objekt).

Kommentarer

  • Redigeret spørgsmålobjekt- > klasse.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *