Quali costi generali e altre considerazioni ci sono quando si usa una struttura rispetto a una classe?

C su sistemi embedded utilizza tradizionalmente gli struct per contenere dati strutturati.

Arduino porta il C ++ nella tabella, quindi possiamo usare le classi invece.

Supponiamo di avere 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 della struttura viene utilizzata pesantemente – perché è questo?

Commenti

  • se ricordo correttamente il mio C ++ non cè differenza tra struct e class oltre alla visibilità predefinita
  • Suppongo che struct vengono utilizzati principalmente perché la grande maggioranza dellhardware incorporato è codificata in C, quindi chiunque trascorra molto tempo a scrivere codice per piccoli MCU probabilmente conosce C molto meglio di C ++, e raggiunge automaticamente gli idiomi C prima degli idiomi C ++. ' un programmatore problema di prestazioni.

Risposta

Come tratto dalla risposta accettata da Quando dovresti usare una classe rispetto a una struttura in C ++?

Lunica differenza tra una classe e una struttura in C ++ è che le strutture hanno membri pubblici predefiniti e 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, possono usare lereditarietà e possono avere funzioni membro.

Suggerirei di usare le strutture come semplici strutture di dati vecchi senza alcuna caratteristica di tipo classe, e utilizzando classi come strutture di dati aggregate con dati privati e funzioni membro.

Per quanto riguarda la memoria, il modificatore di accesso non fa differenza e dati i vincoli di memoria di Arduino, è meno probabile che le persone utilizzino classi con gerarchie complesse, ma preferiscono comunque le strutture POD.

Answer

A differenza di C, unistanza di un struct in C ++ è un oggetto esattamente allo stesso modo di unistanza di class. Dal punto di vista del codice compilato, sono identici. Lutilizzo della memoria, lallineamento, i tempi di accesso ecc. Sono esattamente gli stessi (ovvero non ci sono costi generali).

Dal punto di vista del programmatore, cè una differenza minima. Membri di un struct hanno visibilità pubblica per impostazione predefinita, mentre i membri di un class hanno visibilità privata per impostazione predefinita. In caso contrario, tutte le funzioni della lingua funzionano allo stesso modo su entrambi, come costruttori / distruttori, ereditarietà, polimorfismo, modelli e sovraccarico di operatori. Puoi anche derivare un struct da un class e vice viceversa.

Nonostante la somiglianza, è abbastanza comune vedere persone che usano deliberatamente un struct in C ++ per strutture molto semplici, ad es. dove consiste solo di pochi membri di dati, ma nessuna funzione. Un class verrebbe utilizzato per qualcosa di più complesso. Questa è puramente una questione di convenzione o di preferenze personali e può essere usata come una sottile indicazione della complessità prevista dalla struttura.

Risposta

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

Risposta

In termini di memoria, che differenza farà?

Nessuno. Le strutture e le classi sono la stessa cosa, differiscono solo per i livelli di protezione e la creazione di istanze crea un “oggetto”.

continua a notare che la tecnica della struttura viene ancora utilizzata pesantemente: perché è questo?

Meno battitura se tu ” non stai cercando di nascondere i membri dei dati.

Rispondi

Tieni presente che

typedef struct { ... } Foo; 

è obsoleto in C ++ e dovresti semplicemente usare

struct Foo { ... }; 

Non è molto chiaro nelle risposte ma laltro effetto degli struct è ereditarietà pubblica per impostazione predefinita vs eredità privata per impostazione predefinita con le classi.

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

Anche tecnicamente dovrebbe essere “struct vs object” “struct vs class” (come istanziare uno struct o una classe fornisce ancora un oggetto).

Commenti

  • Oggetto domanda modificato- > class.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *