Domanda

Mi chiedo perché i seguenti due tipi

struct {
    double re[2];
};

e

double re[2];

hanno le stesse dimensioni in C? Struct non aggiunge un po 'di overhead di dimensione?

È stato utile?

Soluzione

No, semplicemente compone tutti gli elementi in un elemento di livello superiore la cui dimensione è semplicemente la dimensione dei singoli elementi sommati (più un po 'di riempimento a seconda delle regole di allineamento, ma non rientra nell'ambito di questa domanda).

Altri suggerimenti

Non se può aiutarlo - no. C evita le spese generali come la peste. E in particolare, evita le spese generali in questo contesto.

Se hai utilizzato una struttura diversa, potresti notare una differenza:

struct space_filled
{
    char       part0;
    double     part1;
};

Se la tua macchina richiede che double sia allineato su un limite di 8 byte (e sizeof (double) == 8 , che è normale ma non obbligatorio dalla norma ), scoprirai che la struttura occupa 16 byte.

No, la struttura non deve aggiungere nulla. A differenza di Java o .NET, dove le classi (e le strutture) hanno un sacco di altre responsabilità, in C e C ++, sono semplicemente contenitori usati per contenere un numero di membri di dati. In C ++, potrebbe essere necessario archiviare una vtable per risolvere le chiamate di funzione virtuale, se presenti, ma in generale no, una struttura in sé non ha costi generali.

L'unica eccezione è questa:

typedef struct {} empty;
assert(sizeof(empty) > 0);

La dimensione di una struttura vuota non sarà zero. Una struttura deve avere alcune dimensioni diverse da zero poiché ogni oggetto deve avere un indirizzo univoco. (Altrimenti non saresti in grado di creare una matrice di queste strutture)

No. Struct non aggiunge alcuna dimensione né presenta alcun sovraccarico nel C. compilato

È un livello di sintassi che richiede ulteriore lavoro da parte del compilatore, ma non ha costi generali in fase di esecuzione.

C è estremamente "nudo" lingua, nel senso che non c'è nulla se non richiesto. Quindi chiediti, " quale spese generali richiede una struttura? & Quot ;, e non ne troverai nessuna.

No, no.

Questo è uno dei punti positivi delle strutture (perché sono stati così utili nella programmazione TCP / IP della vecchia scuola).

È un buon modo per rappresentare il layout di memoria / buffer.

no il tipo di struttura in C ha solo un layout sequenziale dei membri in memoria

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top