Sto lavorando con strutture e ho diverse domande su di loro. Come capisco, le variabili di struttura saranno collocate nella memoria in modo sequenziale. La lunghezza dei blocchi (parole) dipende dall'architettura della macchina (32 bit - 4 byte, 64 bit - 8 byte).C: allineamento strutture dati
consente di dire che abbiamo 2 strutture dati:
struct ST1 {
char c1;
short s;
char c2;
double d;
int i;
};
In memoria sarà:
32 bit - 20 bytes
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 |
------------------------------------------------------------------------------------------
c1| PB| s | s | c1| PB| PB| PB| d | d | d | d | d | d | d | d | i | i | i | i |
64 bit - 24 bytes | 20 | 21 | 22 | 23 |
previous sequence + ---------------------
| PB | PB | PB | PB |
Ma possiamo riorganizzare esso, per rendere questa forma di dati in parola della macchina. Come questo:
struct ST2 {
double d;
int i;
short s;
char c1;
char c2;
};
In questo caso 32 e 64 bit sarà rappresentata allo stesso modo (16 byte):
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
----------------------------------------------------------------------
d | d | d | d | d | d | d | d | i | i | i | i | s | s | ch1| ch2|
Ho un paio di domande:
- È come un'ipotesi, ma la regola principale per
struct
consiste nel definire le variabili con dimensioni maggiori all'inizio? - Come ho capito, non funziona con variabili autonome. Come
char str[] = "Hello";
? - byte di riempimento, che codice ha? È da qualche parte al tavolo ASCII? Spiacente, non ho potuto trovarlo.
- 2 strutture con tutti i membri rappresentati in memoria da indirizzi diversi e possono essere posizionati non in modo sequenziale in memoria?
- Tale struttura:
struct ST3 { char c1; char c2; char c3;} st3;
size = 3
, ho capito che se aggiungeremo un membro con un altro tipo, sarà allineato. Ma perché non è allineato prima di esso?
wait, what? usando 'packed' si eliminerà il padding, possibilmente forzando i membri a * not * essere allineati correttamente, il che ha implicazioni anche su x86 (ad esempio l'accesso a' double' è atomico solo se è allineato correttamente) – Christoph
Come dice Cristoph, questa risposta è completa disinformazione. – Casey