Come calcolare il valore di sizeof (struct) in C


Migliore risposta

La sequenza esatta sizeof(struct) è un errore di compilazione in C. Presumo tu stia chiedendo come determinare la dimensione di un particolare struct.

Questa risposta non è fornita direttamente dalla definizione del linguaggio C. Piuttosto, è una funzione dellABI per la tua particolare architettura di destinazione. (ABI sta per Application Binary Interface.)

Lo standard del linguaggio C stabilisce alcune regole generali. Ad esempio, se hai un struct con più membri, il primo membro condividerà un indirizzo con lo stesso struct e i membri successivi lo faranno essere a indirizzi più alti.

I bitfield hanno il proprio insieme di regole. Non li ricapitolerò qui.

Per un primo ordine, la dimensione di un struct sarà almeno grande quanto la somma delle dimensioni dei suoi membri (ignorando per il momento i campi di bit). I membri possono avere vincoli di allineamento e, in tal caso, lambiente può introdurre il riempimento tra i membri e il riempimento alla fine di struct.

Considera quanto segue struct su unarchitettura che richiede lallineamento di 8 byte per i valori double:

struct fun {

char a;

double b;

char c;

};

Secondo le regole del linguaggio C, b deve trovarsi a un indirizzo più alto di a in qualsiasi istanza di struct fun. Allo stesso modo, c deve trovarsi a un indirizzo più alto di b.

Di conseguenza, questa particolare struttura probabilmente occupa 24 byte, a causa dei vincoli di allineamento su b su tale architettura. La stessa struttura potrebbe richiedere solo 16 byte su unarchitettura che richiede solo un allineamento di 4 byte per double.

Non mi credi?

Verifica tu stesso:

In definitiva, devi consultare lABI della tua piattaforma di destinazione per capire in che modo un struct viene impacchettato per quel target.

Oppure, usa semplicemente sizeof se personalmente non ti interessa, ma al tuo codice deve interessare.

Rispondi

Come faccio a calcolare il valore di sizeof (struct) in C?

Non lo fai. Il compilatore sì.

Prima di tutto, sizeof(struct) è un errore di sintassi. Probabilmente stai chiedendo come determinare la dimensione di un tipo di struttura o di un oggetto di tale tipo. È importante essere precisi. (Capisco che la rimozione dei dettagli delle domande da parte di Quora lo renda difficile.)

Supponiamo che tu abbia un tipo di struttura chiamato struct foo e / o un oggetto di quel tipo denominato obj. La dimensione del tipo è sizeof (struct foo) e la dimensione delloggetto (che è la stessa del tipo) è sizeof foo . (Le parentesi sono obbligatorie nel primo caso e non nel secondo. In realtà esistono due diverse forme delloperatore sizeof. Una viene applicata a un nome di tipo tra parentesi, laltra a un espressione, che spesso, ma non sempre, è il nome di un oggetto.)

Potresti pensare di poter calcolare la dimensione di una struttura sommando le dimensioni dei suoi membri. Non puoi. I compilatori possono inserire e inseriscono il riempimento tra i membri, e possibilmente dopo lultimo membro, per soddisfare i requisiti di allineamento. La dimensione di una struttura è almeno la somma delle dimensioni dei suoi membri, ma se hai bisogno della dimensione dellintera struttura, usa sizeof. Ecco a cosa serve.

Lascia un commento

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