Jaké režijní náklady a další úvahy existují při použití struktury vs třídy?

C na integrovaných systémech tradičně používá struktury k uchovávání strukturovaných dat.

Arduino přináší do tabulky C ++, takže můžeme používat třídy místo toho.

Řekněme, že máme dvě různé datové struktury, které lze považovat za velmi podobné:

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

a:

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

Jaký bude rozdíl v paměti?

Stále vidím, že se technika struktury často používá – proč?

Komentáře

  • pokud si správně vzpomínám na svůj C ++ není rozdíl mezi struct a class kromě výchozí viditelnosti
  • předpokládám s se používají hlavně proto, že velká většina vestavěného hardwaru je kódována v jazyce C, takže každý, kdo tráví spoustu času psaním kódu pro malé MCU, pravděpodobně zná C mnohem lépe než C ++, a automaticky dosáhne C idiomů před C ++ idiomy. To ' sa programátor problém s výkonem.

Odpověď

Převzato z přijaté odpovědi od Kdy byste měli použít třídu vs strukturu v C ++?

Jediný rozdíl mezi třídou a strukturou v C ++ spočívá v tom, že struktury mají výchozí veřejné členy a základny a třídy mají výchozí soukromé členy a základny. Obě třídy a struktury mohou mít směs veřejných a soukromých členů, mohou používat dědičnost a mohou mít členské funkce.

Doporučil bych použít struktury jako prosté staré datové struktury bez jakýchkoli funkcí ve třídě, a používání tříd jako agregovaných datových struktur se soukromými daty a členskými funkcemi.

Paměťově modifikátor přístupu nedělá žádný rozdíl a vzhledem k paměťovým omezením Arduina, lidé méně často používají třídy se složitými hierarchiemi, ale stejně preferují struktury POD.

Odpověď

Na rozdíl od C instance struct v C ++ je objekt přesně stejným způsobem jako instance class. Z pohledu kompilovaného kódu jsou identické. Využití paměti, zarovnání, doby přístupu atd. Jsou přesně stejné (tj. Nejsou zde žádné režijní náklady).

Z pohledu programátora je velmi malý rozdíl. Členové struct mají ve výchozím nastavení veřejnou viditelnost, zatímco členové class mají ve výchozím nastavení soukromou viditelnost. Jinak fungují všechny jazykové funkce u obou stejně, jako jsou konstruktory / destruktory, dědičnost, polymorfismus, šablony a přetížení operátorů. Můžete dokonce odvodit struct z class a vice naopak.

Navzdory podobnosti je zcela běžné vidět lidi záměrně používat struct v C ++ pro velmi jednoduché struktury, např. kde se skládá pouze z několika datových členů, ale bez funkcí. A class by bylo použito pro cokoli složitějšího. Toto je čistě záležitost konvence nebo osobních preferencí a lze ji použít jako jemné označení zamýšlené složitosti struktury.

Odpověď

Jak již zdůraznily další odpovědi, vaše konkrétní struct a class výkony jsou k nerozeznání (existují malé rozdíly v rozsahy názvů typů kvůli způsobu, jakým jste definovali svou strukturu). Vymezení v C ++ není mezi struct a class, ale mezi typy, které jsou POD (prostá stará data) a typy, které nejsou, jak je vysvětleno v této diskusi .

Odpověď

Jaký bude rozdíl v paměti?

Žádné. Struktury a třídy jsou stejné, liší se pouze v úrovních ochrany a instancí se vytvoří buď „objekt“.

stále vidíte, jak se strukturovaná technika často používá – proč?

Méně psaní, pokud “ nepokouším se skrýt datové členy.

Odpověď

Všimněte si, že

typedef struct { ... } Foo; 

je v jazyce C ++ zastaralý a měli byste použít pouze

struct Foo { ... }; 

V odpovědích to není příliš jasné, ale další účinek struktur je veřejná dědičnost ve výchozím nastavení vs soukromá dědičnost ve výchozím nastavení s třídami.

Jak zmínili ostatní, použití struktury je obecně konvencí pro typy POD.

Také technicky by měl být „struct vs objekt“ „struct vs class“ (jako vytvoření instance struktury nebo třídy stále dává objekt).

Komentáře

  • Upravený objekt otázky – > třída.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *