Sto utilizzando __attribute__((packed))
per evitare il riempimento della struttura. Il codice seguente funziona correttamente, ma quando aggiungo un altro membro int
all'interno della struct, il compilatore esegue il pad della mia struct.Evitare il riempimento della struttura in c utilizzando __attribute __ ((impacchettato))
#include <stdio.h>
struct test {
int x;
char c1;
char c2;
char c3;
char c4;
char c5;
// int d; Pads if I uncomment
} __attribute__((packed)) obj = {50,'X','Y','Z','A','B'};
int main()
{
struct test *ptr= &obj;
char *ind = (char *) &obj;
printf("\nLet's see what is the address of obj %d", ptr);
printf("\n Size of obj is : %d bytes ", sizeof(obj));
printf("\nAddress of x is %d", &ptr->x);
printf("\nAddress of c1 is %d", &ptr->c1);
printf("\nAddress of c2 is %d", &ptr->c2);
printf("\nValue of x is %d", ptr->x);
printf("\nAddress of x is %c", ptr->c1);
printf("\nFetching value of c4 through offset %c", *(ind+7));
}
Il codice precedente funziona come previsto e la dimensione di obj
è 9 byte (con imbottitura era 12 byte).
Tuttavia, quando scommentare int d
nel mio struct uscite codice:
Superficie obj é: 16 byte
invece dei 13 (9 + 4) byte attesi.
Cosa c'è che non va?
Per quale CPU si sta compilando? –
Hai provato a racchiudere la struttura tra '#pragma pack (push, 1)' e '#pragma pack (pop)' che credo sia parte di gcc (invece di usare l'attributo)? Con MSVC, si ottengono le dimensioni 9 e 13. –
Per lo più osservo questa domanda per vedere come si sviluppa, ma questo potrebbe essere rilevante: http://www.bttr-software.de/forum/mix_entry.php?id=11767. Sembra che l'idea di imballaggio di GCC possa in qualche modo essere una bugia. Non ho letto l'intero thread, ma forse ci sono alcune opzioni del compilatore che lo faranno sparire, a seconda del tuo esatto compilatore (versione inclusa), CPU e sistema operativo. Sospetto anche che forse il compilatore abbia ancora il diritto di tamponare alla fine, ma non nel mezzo. Cosa succede se metti 'd' dopo 'c1'? Il padding sarebbe ancora alla fine della struct o tra c1 e d? – Dmitri