2015-04-02 11 views
5

compilatori tipicamente inserire trascinamento imbottitura strutture per soddisfare allineamento restrizioni quando sono usati in array:trascinamento imbottitura in struttura interna

// Size 4, alignment 2 
struct A { 
    uint16_t x; 
    uint8_t y; 
    // Padding 1 byte 
}; 

// Size 6, alignment 2 
struct B { 
    struct A xy; 
    uint8_t z; 
    // Padding 1 byte 
}; 

Ora consideriamo combinazione di questi struttura interna utilizzando:

struct AB { 
    struct { 
     uint16_t x; 
     uint8_t y; 
    } xy; 
    uint8_t z; 
}; 

Di seguito potrebbe rientrare in 4 byte, senza tuttavia rompere le restrizioni di allineamento. Inoltre, la struttura interna xy non ha alcun tipo che possa essere utilizzato altrove, quindi il riempimento finale di non è necessario.

Unico inconveniente è che gli xy sarebbe incompatibile con struct A, ma non vi c'è motivo per cui dovrebbe essere come sono in diverse definizioni di tipo.

Il compilatore è autorizzato a eseguire questa ottimizzazione delle dimensioni?

Oppure, per dirla in altro modo, lo standard richiede che 2 strutture con membri uguali abbiano sempre un layout uguale?

+0

Penso che il compilatore sarebbe autorizzato a farlo, poiché lo standard non richiede al compilatore di riempire le strutture. – qbt937

risposta

1

La risposta è probabilmente data dalla nozione di tipi compatibili . Se t1 e t2 sono tipi compatibili, è possibile utilizzare un puntatore su t1 per accedere alla memoria impostata utilizzando il tipo t2.

Nello standard C11:

6.2.7 tipo compatibile e tipo composito

  1. ... Inoltre, due struttura, unione o tipi enumerati dichiarati in unità di traduzione separati sono compatibili se i loro tag e membri soddisfano i seguenti requisiti: Se uno viene dichiarato con un tag, l'altro deve essere dichiarato con lo stesso tag. Se entrambi sono completati ovunque all'interno delle loro rispettive unità di traduzione, si applicano i seguenti requisiti aggiuntivi: deve esserci una corrispondenza uno a uno tra i loro membri in modo tale che ciascuna coppia di membri corrispondenti sia dichiarata con tipi compatibili; se un membro della coppia è dichiarato con un identificatore di allineamento, l'altro è dichiarato con un identificatore di allineamento equivalente; e se un membro della coppia è dichiarato con un nome, l'altro è dichiarato con lo stesso nome. ...

Due le strutture che non hanno lo stesso tag non sono tipi compatibili, e non vedo nulla che li costringono ad avere lo stesso layout.

+1

In effetti, questo è quello a cui stavo pensando anch'io. È bello vedere che qualcun altro è giunto alla stessa conclusione. – user694733