2009-06-19 12 views
6

Mi chiedo il motivo per cui i seguenti due tipidi Struct per digitare dimensioni

struct { 
    double re[2]; 
}; 

e

double re[2]; 

hanno la stessa dimensione in C? Non struct aggiungere un po 'di overhead di dimensioni?

risposta

23

No, si limita a comporre tutti gli elementi in un elemento di livello superiore le cui dimensioni sono semplicemente le dimensioni dei singoli elementi aggiunte (più un riempimento a seconda delle regole di allineamento, ma questo è fuori dallo scopo di questa domanda).

+0

+1 Per menzionare allineamento. –

+1

Per gli effetti dell'allineamento nelle strutture, consultare http://www.unidata.ucar.edu/blogs/default/2009/03/30/1238442300000.html – VolkerK

12

Non se può aiutare - no. C evita le spese generali come la peste. E nello specifico, evita il sovraccarico in questo contesto.

Se è stato utilizzato una struttura diversa, si potrebbe vedere una differenza:

struct space_filled 
{ 
    char  part0; 
    double  part1; 
}; 

Se la vostra macchina richiede double per essere allineato a un limite di 8 byte (e sizeof(double) == 8, che è normale, ma non di mandatario del standard), quindi scoprirete che la struttura occupa 16 byte.

+0

Un char e double dichiarati separatamente avrebbero ancora la stessa quantità di spazio, poiché il padding sarebbe ancora lì. Sarebbe solo uno spazio invisibile nello stack. Ma gli indirizzi degli oggetti rivelerebbero il riempimento. – abelenky

+0

Non necessariamente - se ci fosse un altro char, o un short o un int, o uno di ciascuno in sequenza (sotto ipotesi di dimensioni abbastanza normali), allora non ci sarebbe spazio. Ma in assenza di tali variabili 'filler', hai ragione. (E non credo che lo standard C garantisca che le variabili locali siano disposte in un ordine particolare l'una rispetto all'altra.) –

+1

@ Jonathan: Sono abbastanza sicuro che non lo sia, quindi il compilatore potrebbe ordinare automaticamente gli piace risparmiare spazio, se lo desidera. Infatti, finché un puntatore automatico non lascia l'ambito locale, non penso che gli automatismi debbano essere in pila - il compilatore può tenerli in registri se lo desidera. Credo. –

3

No. Struct non aggiungere qualsiasi dimensione, o avere sovraccarico nella compilato C.

È uno strato di sintassi che richiede un lavoro supplementare dal compilatore, ma non ha sovraccarico in fase di esecuzione.

C è un linguaggio estremamente "nudo", il che significa che nulla è lì se non richiesto. Quindi chiediti: "Quale sovraccarico richiede una struttura?", E non ne troverai.

2

No, non funziona.

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

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

0

nessun tipo struct in C solo in modo sequenziale il layout membri in memoria

5

No, la struct non ha bisogno di 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 memorizzare un vtable per risolvere le chiamate alle funzioni virtuali, se esistono, ma in generale no, una struttura non ha un sovraccarico.

L'unica eccezione è questo:

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

Le dimensioni di uno struct vuoto sarà non essere zero. Una struct deve avere alcune dimensioni diverse da zero poiché ogni oggetto deve avere un indirizzo univoco. (Altrimenti non sarebbe in grado di creare un array di questi struct)

+1

+1 per aver menzionato la struttura vuota. –