Jakie są koszty ogólne i inne kwestie związane z używaniem struktury w porównaniu z klasą?

C w systemach osadzonych tradycyjnie używa struktur do przechowywania danych strukturalnych.

Arduino wprowadza C ++ do tabeli, więc możemy używać klas zamiast tego.

Powiedzmy, że mamy dwie różne struktury danych, które można uznać za bardzo podobne:

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

i:

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

Jeśli chodzi o pamięć, jaka będzie to różnica?

Nadal widzę, że technika struct jest intensywnie używana – dlaczego tak jest?

Komentarze

  • , jeśli poprawnie pamiętam mój C ++ nie ma różnicy między struct a class poza domyślną widocznością
  • Zakładam, że struct są używane głównie dlatego, że ogromna większość wbudowanego sprzętu jest kodowana w C, więc każdy, kto spędza dużo czasu na pisaniu kodu dla małych MCU, prawdopodobnie zna C znacznie lepiej niż C ++, i automatycznie sięga po idiomy C przed idiomami C ++. Jest to ' problem z wydajnością programisty .

Odpowiedź

Na podstawie zaakceptowanej odpowiedzi z Kiedy należy używać klasy, a kiedy struktury w C ++?

Jedyną różnicą między klasą a strukturą w C ++ jest to, że struktury mają domyślne publiczne składowe i bazy, a klasy mają domyślne prywatne składowe i bazy. Zarówno klasy, jak i struktury mogą mieć mieszankę publicznych i prywatnych elementów członkowskich, mogą używać dziedziczenia i mogą mieć funkcje składowe.

Polecam używanie struktur jako zwykłych starych struktur danych bez żadnych cech klasowych, i używanie klas jako zagregowanych struktur danych z prywatnymi danymi i funkcjami składowymi.

Jeśli chodzi o pamięć, modyfikator dostępu nie robi różnicy i biorąc pod uwagę ograniczenia pamięci Arduino, ludzie rzadziej używają klas ze złożonymi hierarchiami, ale i tak wolą struktury POD.

Odpowiedź

W przeciwieństwie do C, instancja struct w C ++ jest obiektem dokładnie w taki sam sposób, jak instancja class. Z punktu widzenia skompilowanego kodu są identyczne. Użycie pamięci, wyrównanie, czasy dostępu itp. Są dokładnie takie same (tj. Nie ma narzutów).

Z punktu widzenia programisty jest bardzo niewielka różnica. Składowe struct mają domyślnie widoczność publiczną, podczas gdy członkowie class mają domyślnie widoczność prywatną. W przeciwnym razie wszystkie funkcje językowe działają tak samo na obu, takie jak konstruktory / destruktory, dziedziczenie, polimorfizm, szablony i przeciążanie operatorów. Możesz nawet wyprowadzić struct z class i vice versa.

Pomimo podobieństwa dość często zdarza się, że ludzie celowo używają struct w C ++ do bardzo prostych struktur, np. gdzie składa się tylko z kilku elementów danych, ale bez funkcji. Element class zostałby użyty do czegoś bardziej złożonego. Jest to jednak kwestia wyłącznie konwencji lub osobistych preferencji i może być użyte jako subtelne wskazanie zamierzonej złożoności struktury.

Odpowiedź

Jak wskazywały inne odpowiedzi, Twoje konkretne struct i class są nie do odróżnienia pod względem wydajności (istnieją niewielkie różnice w zakresy nazw typów, ze względu na sposób, w jaki zdefiniowałeś swoją strukturę. między typami, które są POD (zwykłe stare dane) i typami, które nimi nie są, jak wyjaśniono w tej dyskusji .

Odpowiedź

Jeśli chodzi o pamięć, co to za różnica?

Brak. Struktury i klasy to to samo, różniące się tylko poziomami ochrony, a utworzenie instancji tworzy „obiekt”.

nadal często widzisz, że technika struct jest często używana – dlaczego tak jest?

Mniej pisania, jeśli „ nie próbujesz ukrywać członków danych.

Odpowiedź

Pamiętaj, że

typedef struct { ... } Foo; 

jest przestarzały w C ++ i powinieneś po prostu użyć

struct Foo { ... }; 

Odpowiedzi nie są zbyt jasne, ale innym efektem struktur jest domyślne dziedziczenie publiczne vs domyślne dziedziczenie prywatne z klasami.

Jak wspominali inni, używanie struktury jest generalnie konwencją dla typów POD.

Z technicznego punktu widzenia „struktura vs obiekt” powinno być „struct vs class” (ponieważ tworzenie instancji struktury lub klasy nadal daje obiekt).

Komentarze

  • Edytowany obiekt pytania – > klasa.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *