2017-05-12 2 views
0

Ich versuche, das List-Dienstprogramm zu verwenden, das im Linux-Kernel empfohlen wird. Von der Einführung in https://isis.poly.edu/kulesh/stuff/src/klist/ eine der Funktion des list_head ist, dass das Element zu verschiedenen Listen gehören kann.Linux Kernel list_head Speicherauslastung

Nun, wenn ich eine Liste aller Mitarbeiter und eine Liste der alten Mitarbeiter nur wollen, ich glaube, ich habe die folgenden Daten und Struktur zu definieren:

struct list_head all_staff; 
struct list_head old_staff; 

struct staff { 
    int age; 
    struct list_head list; // for all the staff; 
    struct list_head old; 
}; 

Auf der anderen Seite, die normalen Listenimplementierung kann wie folgt aussehen:

struct staff { 
    int age; 
}; 

struct node { 
    struct node *prev; 
    struct node *next; 
    void *element; 
}; 

Was ist der Vorteil von list_head im Vergleich zur normalen Listenimplementierung? Ich fühle, obwohl die list_head nur 2 Punkte enthält, entfernt den Punkt auf das Element, und so spart es Speicher, aber in diesem Fall muss ich eine weitere list_head in der Personalstruktur hinzufügen, wenn es nur 1 alte Mitarbeiter, dann wird es verschwenden viel Speicher.

Wenn das Personal zu vielen verschiedenen Gruppen gehört, bedeutet das, dass ich viele list_head in der Personalstruktur hinzufügen muss?

Danke.

+0

Je nachdem, wie Sie es verwenden möchten, kann es sinnvoll sein, die Liste zu durchlaufen anstatt mehrere Listen zu verwalten. – 0andriy

+0

Link ist tot. Bitte repariere es. – 0andriy

Antwort

1

Wenn das Personal zu vielen verschiedenen Gruppen gehört, bedeutet das, dass ich viele list_head in der Personalstruktur hinzufügen muss?

Ja, müssen Sie mehr list_head Felder im stuff Objekt, so dass es auf mehrere Listen zur gleichen Zeit gehört.

Welchen Vorteil hat list_head im Vergleich zur normalen Listenimplementierung?

list_head ist fertige Implementierung. Wenn Sie jedoch "normale" Listen verwenden, müssen Sie die Listenfunktionen manuell für implementieren, wobei Sie jeden Objekttyp als Listenelement verwenden.