Un po 'di contesto reale dice più chiaro, sotto uso albero rosso-nero, come ad esempio, che è la modo che capisco container_of
.
come Documentation/rbtree.txt
stati, nel codice del kernel di Linux, non è rb_node contengono dati entrata, piuttosto
nodi di dati in un albero di rbtree sono strutture che contengono un membro rb_node struct .
struct vm_area_struct
(nel file di include/linux/mm_types.h:284
) è una tale struttura,
nello stesso file , esiste una macro rb_entry
che è definita come
#define rb_entry(ptr, type, member) container_of(ptr, type, member)
chiaramente, rb_entry
è stessa container_of
.
a mm/mmap.c:299
all'interno definizione di funzione browse_rb
, v'è un uso di rb_entry
:
static int browse_rb(struct mm_struct *mm)
{
/* two line code not matter */
struct rb_node *nd, *pn = NULL; /*nd, first arg, i.e. ptr. */
unsigned long prev = 0, pend = 0;
for (nd = rb_first(root); nd; nd = rb_next(nd)) {
struct vm_area_struct *vma;
vma = rb_entry(nd, struct vm_area_struct, vm_rb);
/* -- usage of rb_entry (equivalent to container_of) */
/* more code not matter here */
Ora è chiaro, in container_of(ptr, type, member)
,
type
è la struct contenitore, qui struct vm_area_struct
member
è il nome di un membro di type
esempio, qui vm_rb
, che è di tipo rb_node
,
ptr
è un puntatore che indica member
di type
esempio, qui rb_node *nd
.
ciò container_of
fare è, come in questo esempio,
- dato indirizzo di
obj.member
(qui obj.vm_rb
), restituirà l'indirizzo di obj
.
- dal momento che una struct è un blocco di memoria contigua, indirizzo del
obj.vm_rb
meno offset between the struct and member
sarà l'indirizzo del contenitore.
include/linux/kernel.h:858
- definizione di container_of
include/linux/rbtree.h:51
- definizione di rb_entry
mm/mmap.c:299
- utilizzo di rb_entry
include/linux/mm_types.h:284
- struct vm_area_struct
Documentation/rbtree.txt:
- Documentazione di rosso-nero albero
include/linux/rbtree.h:36
- definizione di struct rb_node
P.S.
I file sopra indicati sono in versione di sviluppo corrente, ad esempio 4.13.0-rc7
.
file:k
mean kth line in file
.
[questa risposta] (https://stackoverflow.com/a/45923596/3625404) ha ** un esempio reale e intuitivo ** utilizzando albero rosso-nero 'rb_node'. – qeatzy