Jakie są narzuty i inne uwagi związane z używaniem struktury vs klasy?


17

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

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

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ęć, co to za różnica?

Nadal widzę, że technika strukturalna jest często używana - dlaczego?


5
jeśli poprawnie przywołam mój C ++, nie ma różnicy między widocznością domyślną structi classpoza nią
maniak ratchet

4
Przypuszczam structs wykorzystywane są głównie dlatego, że wielki większość osadzonych sprzętu jest kodowana w C, więc każdy, kto spędza dużo czasu pisania kodu dla małych mikrokontrolerów zapewne wie C znacznie lepiej niż C ++, i automatycznie sięga idiomów C przed C ++ idiomów. Jest to problem z wydajnością programisty .
Connor Wolf,

Odpowiedzi:


13

Jak zaczerpnięto z zaakceptowanej odpowiedzi z Kiedy używać klasy w porównaniu do struktury w C ++?

Jedyna różnica między klasą a strukturą w C ++ polega na tym, że struktury mają domyślne elementy publiczne i bazy, a klasy mają domyślne elementy prywatne i bazy. Zarówno klasy, jak i struktury mogą mieć mieszankę członków publicznych i prywatnych, mogą korzystać z dziedziczenia i mogą mieć funkcje członka.

Poleciłbym użycie struktur jako zwykłych struktur danych bez żadnych funkcji podobnych do klas, i użycie klas jako agregujących struktur danych z prywatnymi danymi i funkcjami składowymi.

Jeśli chodzi o pamięć, modyfikator dostępu nie ma znaczenia, a biorąc pod uwagę ograniczenia pamięci Arduino, ludzie rzadziej korzystają z klas o złożonej hierarchii, ale i tak wolą struktury POD.


6

W przeciwieństwie do C, instancja structw C ++ jest obiektem dokładnie tak samo, jak instancja a class. Z punktu widzenia skompilowanego kodu są one identyczne. Zużycie pamięci, wyrównanie, czasy dostępu itp. Są dokładnie takie same (tj. Nie ma narzutów).

Z punktu widzenia programisty różnica jest niewielka. Członkowie structmają domyślnie widoczność publiczną, natomiast członkowie classmają domyślnie widoczność prywatną. W przeciwnym razie wszystkie funkcje języka działają tak samo na obu, takie jak konstruktory / destruktory, dziedziczenie, polimorfizm, szablony i przeciążanie operatora. Możesz nawet wyprowadzić structz a classi vice versa.

Pomimo podobieństwa dość często ludzie celowo używają structw C ++ bardzo prostych struktur, np. Gdy składa się tylko z kilku elementów danych, ale nie ma żadnych funkcji. classBędą wykorzystywane do bardziej skomplikowanych. Jest to jednak kwestia konwencji lub osobistych preferencji i może być używana jako subtelne wskazanie zamierzonej złożoności konstrukcji.


4

Jak wskazały inne odpowiedzi, twój konkretny structi classsą nierozróżnialne pod względem wydajności (istnieją niewielkie różnice w zakresie nazw typów, ze względu na sposób zdefiniowania struktury). Opis w C ++ nie jest pomiędzy structi class, ale między typami, które są POD (zwykłe stare dane) i typami, które nie są, jak wyjaśniono w tej dyskusji .


3

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

Żaden. Struktury i klasy są tym samym, różnią się tylko poziomami ochrony, a tworzenie ich instancji tworzy „obiekt”.

wciąż widzę, że technika strukturalna jest często używana - dlaczego?

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


2

Zauważ, że

typedef struct { ... } Foo;

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

struct Foo { ... };

Nie jest to zbyt jasne w odpowiedziach, ale drugim efektem struktur jest domyślnie dziedziczenie publiczne w porównaniu do dziedziczenia prywatnego z klasami.

Jak wspomnieli inni, użycie struct jest ogólnie konwencją dla typów POD.

Również technicznie „struct vs object” powinien być „struct vs class” (ponieważ tworzenie instancji struct lub klasa nadal daje obiekt).


Edytowane pytanie obiekt-> klasa.
Cybergibbons,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.