Accesso all'attributo struct: casting vs nome del campo

0

Stavo solo esaminando alcuni codice del kernel , ho notato che rb->__rb_parent_color = (unsigned long)p | color; è un po 'cablato. Si accede al primo campo di una struct gettando il puntatore e non usando il nome del campo.

Qui è la definizione di quella struttura, come puoi vedere il colore è il primo attributo, quindi il semplice casting (unsigned long)p ci darà lo stesso rb->__rb_parent_color . Ma perché gli sviluppatori hanno scelto di farlo in questo modo e di non utilizzare -> ?

L'unica ragione per cui posso pensare sono le ottimizzazioni del compilatore che non vengono eseguite quando si usa rb->__rb_parent_color , ma è difficile crederlo perché sembra che il compilatore, in entrambi i casi, calcoli lo stesso offset senza problemi.

    
posta Ramzi Kahil 02.11.2014 - 13:34
fonte

1 risposta

1

struct rb_node *p è non dereferenziato. Leggi di nuovo: questo codice lancia l' indirizzo in unsigned long .

Ciò si basa sul fatto che gli indirizzi degli oggetti sono allineati in modo tale che il bit inferiore (almeno) dell'indirizzo sia garantito non utilizzato, quindi impacchetta il colore in quel bit. Quindi __rb_parent_color qui non significa il colore del genitore: significa che il puntatore genitore e il suo colore sono memorizzati in questo campo.

Leggi i macro __rb_parent e __rb_color sopra per vedere come viene utilizzato il campo. ( __rb_parent in realtà implica che i 2 bit inferiori non sono usati, dando un allineamento a 4 byte, ma niente sembra usare il secondo bit in entrambi i casi.)

    
risposta data 02.11.2014 - 14:43
fonte

Leggi altre domande sui tag