Quali costi generali e altre considerazioni ci sono quando si utilizza una struttura vs una classe?


16

C su sistemi embedded utilizza tradizionalmente strutture per contenere dati strutturati.

Arduino porta C ++ sul tavolo, quindi possiamo usare le classi.

Diciamo che abbiamo due diverse strutture di dati che potrebbero essere considerate molto simili:

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

e:

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

In termini di memoria, che differenza farà?

Vedo ancora che la tecnica struct viene utilizzata pesantemente: perché?


5
se ricordo bene il mio C ++ non c'è differenza tra structe classoltre alla visibilità predefinita
maniaco del cricchetto

4
Suppongo che gli structs siano usati principalmente perché la grande maggioranza dell'hardware incorporato è codificato in C, quindi chiunque spenda molto tempo a scrivere codice per MCU di piccole dimensioni probabilmente conosce C molto meglio di C ++ e raggiunge automaticamente idiomi C prima di idiomi C ++. È un problema di prestazioni del programmatore .
Connor Wolf,

Risposte:


12

Come tratto dalla risposta accettata di Quando dovresti usare una classe contro uno struct in C ++?

L'unica differenza tra una classe e una struttura in C ++ è che le strutture hanno membri pubblici predefiniti e le basi e le classi hanno membri e basi privati ​​predefiniti. Sia le classi che le strutture possono avere una combinazione di membri pubblici e privati, utilizzare l'ereditarietà e avere funzioni membro.

Consiglierei di usare le strutture come strutture di dati semplici e vecchie senza alcuna caratteristica di classe e di usare le classi come strutture di dati aggregati con dati privati ​​e funzioni membro.

Per quanto riguarda la memoria, il modificatore di accesso non fa alcuna differenza e dati i vincoli di memoria di Arduino, le persone hanno meno probabilità di usare classi con gerarchie complesse, ma preferiscono comunque le strutture POD.


5

A differenza di C, un'istanza di a structin C ++ è un oggetto esattamente allo stesso modo di un'istanza di a class. Dal punto di vista del codice compilato, sono identici. L'utilizzo della memoria, l'allineamento, i tempi di accesso ecc. Sono esattamente gli stessi (cioè non ci sono spese generali).

Dal punto di vista del programmatore, c'è una differenza molto piccola. I membri di un structhanno visibilità pubblica per impostazione predefinita, mentre i membri di un classhanno visibilità privata per impostazione predefinita. Altrimenti, tutte le funzionalità del linguaggio funzionano allo stesso modo su entrambi, come costruttori / distruttori, ereditarietà, polimorfismo, modelli e sovraccarico dell'operatore. Puoi persino derivare a structda a classe viceversa.

Nonostante la somiglianza, è abbastanza comune vedere persone che usano deliberatamente un file structin C ++ per strutture molto semplici, ad esempio dove è composto solo da pochi membri di dati, ma senza funzioni. A classsarebbe usato per qualcosa di più complesso. Questa è puramente una questione di convenzione o preferenza personale, e può essere usata come una sottile indicazione della complessità prevista dalla struttura.


4

Come hanno sottolineato altre risposte, le tue prestazioni particolari structe classsono indistinguibili dal punto di vista delle prestazioni (ci sono lievi differenze negli ambiti dei nomi dei tipi, a causa del modo in cui hai definito la struttura). La delineazione in C ++ non è tra structe class, ma tra tipi che sono POD (semplici vecchi dati) e tipi che non lo sono, come spiegato in questa discussione .


3

In termini di memoria, che differenza farà?

Nessuna. Le strutture e le classi sono la stessa cosa, differiscono solo per i livelli di protezione e l'istanza crea un "oggetto".

vedo ancora la tecnica struct usata pesantemente - perché è questo?

Meno digitazione se non stai cercando di nascondere i membri dei dati.


2

Nota che

typedef struct { ... } Foo;

è obsoleto in C ++ e dovresti semplicemente usare

struct Foo { ... };

Non è molto chiaro nelle risposte, ma l'altro effetto delle strutture è l'eredità pubblica di default rispetto all'eredità privata di default con le classi.

Come menzionato da altri, l'uso di struct è generalmente una convenzione per i tipi di POD.

Anche tecnicamente 'struct vs object' dovrebbe essere 'struct vs class' (poiché l'istanza di una struct o di una classe fornisce ancora un oggetto).


Oggetto della domanda modificato-> classe.
Cybergibbons,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.