Vilka omkostnader och andra överväganden finns när man använder en struktur mot en klass?

C på inbäddade system har traditionellt använt strukturer för att hålla strukturerad data.

Arduino tar C ++ till bordet, så att vi kan använda klasser istället.

Låt oss säga att vi har två olika datastrukturer som kan anses vara mycket lika:

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

och:

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

Vad gäller minne, vilken skillnad kommer det att göra?

Jag ser fortfarande att strukturtekniken används kraftigt – varför är det här?

Kommentarer

  • om jag minns min C ++ korrekt det finns ingen skillnad mellan struct och class förutom standardsynligheten
  • Jag antar att struct används främst för att den stora majoriteten av inbäddad maskinvara är kodad i C, så den som spenderar mycket tid på att skriva kod för små MCU-enheter känner förmodligen C mycket bättre än C ++, och når automatiskt efter C-idiomer före C ++ – idiom. Det ' är programmerare prestandafråga.

Svar

Som hämtat från det accepterade svaret från När ska du använda en klass mot en struct i C ++?

Den enda skillnaden mellan en klass och en struktur i C ++ är att structts har standard offentliga medlemmar och baser och klasser har standard privata medlemmar och baser. Både klasser och strukturer kan ha en blandning av offentliga och privata medlemmar, kan använda arv och kan ha medlemsfunktioner.

Jag rekommenderar att du använder strängar som vanligt gamla datastrukturer utan några klassliknande funktioner, och att använda klasser som aggregerade datastrukturer med privata data och medlemsfunktioner.

Minnesmässigt gör åtkomstmodifieraren ingen skillnad och med tanke på Arduino-minnets begränsningar, människor är mindre benägna att använda klasser med komplexa hierarkier, men föredrar ändå POD-strukturer.

Svar

Till skillnad från C, en instans av en struct i C ++ är ett objekt på exakt samma sätt som en instans av en class. Från den kompilerade kodens synvinkel är de identiska. Minnesanvändning, justering, åtkomsttider etc. är exakt desamma (dvs. det finns inga omkostnader).

Från programmerarens synvinkel är det en mycket liten skillnad. Medlemmar av en struct har allmän synlighet som standard, medan medlemmar i class har privat synlighet som standard. Annars fungerar alla språkfunktioner på båda, som konstruktörer / förstörare, arv, polymorfism, mallar och operatörsöverbelastning. Du kan till och med härleda en struct från en class och vice versa.

Trots likheten är det ganska vanligt att se människor medvetet använda en struct i C ++ för mycket enkla strukturer, t.ex. där den bara består av ett fåtal datamedlemmar, men inga funktioner. En class skulle användas för allt mer komplicerat. Detta är dock enbart en fråga om konvention eller personlig preferens och kan användas som en subtil indikation på strukturens avsedda komplexitet.

Svar

Som andra svar har påpekat är din specifika struct och class oskiljbara prestandamässigt (Det finns små skillnader i omfattningen av typnamnen, på grund av hur du definierade din struktur). Avgränsningen i C ++ är inte mellan struct och class mellan typer som är POD (vanliga gamla data) och typer som inte är, som förklaras i denna diskussion .

Svar

När det gäller minne, vilken skillnad kommer det att göra?

Ingen. Strängar och klasser är samma sak, de skiljer sig endast i skyddsnivåer och om du antingen omedelbart skapas skapas ett ”objekt”.

ser fortfarande att strukturtekniken används kraftigt – varför är det här?

Mindre skrivning om du ” försöker inte dölja datamedlemmar.

Svar

Observera att

typedef struct { ... } Foo; 

är föråldrad i C ++ och du ska bara använda

struct Foo { ... }; 

Det är inte särskilt tydligt i svaren men den andra effekten av structs är offentligt arv som standard jämfört med privat ärv som standard med klasser.

Som nämnts av andra är användning av struct i allmänhet en konvention för POD-typer.

Även tekniskt bör ”struct vs object” vara ”struct vs class” (eftersom instiniering av en struct eller en klass fortfarande ger ett objekt).

Kommentarer

  • Redigerat frågeobjekt- > klass.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *