[C] struct list vs. std::list?

posi90

Erfahrenes Mitglied
Hallo,

Ich schreibe gerade an einem Server-Daemon und will meine Client-Sockets in eine Liste speichern.

Code:
struct socketset
{
	int ID;
	SOCKET s;
	struct socketset *next;
};

Nun aber hab ich mich etwas herumgegoogelt und bin auf std::list gestoßen, die ich noch nicht verstehe.
lt. Chip-Post zum Thema Listen:

Im allgemeinen ist es besser std::list, std::string, wenig malloc bzw. free wenn überhaupt new/delete, wenige Zeiger (bei meiner jetztigen Structur mit *next kaum vermeidbar) zu verwenden.

Was ist jetzt besser? Bzw. Wie funktioniert so eine std::list? Bin leider durch das cplusplus forum nicht schlauer geworden.

Ziel bzw. Anforderung an meine "Liste" ist, schnelles Anfügen(hinten reicht vollkommen), schnelles bzw. einfaches Löschen und das wichtigste der Zugriff, auch am Besten schnell und einfach.

mfg. Poseidon
 
Zuletzt bearbeitet:
Dem "Im Allgemeinen ist es besser, std::... zu verwenden" kann ich nur bedingt zustimmen.

Wenn man sich einmal mit den vorgefertigten Sachen auskennt, geht das Programmieren oft schneller als eine eigene Liste zu implementieren.
Je nach Situation kann eine std::list aber auch recht umständlich werden bzw. eine speziell für diesen Fall implementierte Collection wäre laufzeitmäßig vorteilhafter.

Die Implementierung der std::list ist sicher nicht schlecht, aber eben universell.
Ich weiß ja nicht, welche Auslastung dein Server erwartet, aber Performancegweinn nie schlecht.
Wenn du dafür speziell für irgendwas eine Collection brauchst, würd ich sie selber schreiben und wirklich nur genau das Benötigte implementieren.
Keinen Speicher/Rechenleistung verschwenden für Dinge die du nicht verwendest.

Wegen den möglichst wenigen Zeigern:
Da gilt dasselbe wie oben. Eine Liste braucht für jedes Element noch einen Pointer mit jeweils 4/8 Byte.
Den "verschwendeten" Speicher könnte man sich mit einem normalen Array sparen.
Ob das sinnvoll ist, kommt nur wieder auf die Situation an.
Ob dein Array voraussichtlich ca. 0 bis 20 Elemente haben wird oder die Datenmenge zu den GB geht (und ein Element rauslöschen eine gewaltige Umschichteaktion wäre)...

Zu möglichst wenig malloc/free:
Das bezieht sich wohl hauptsächlich auf realloc.
Für Datentypen wie int etc macht new auch nichts anderes, als malloc aufzurufen, ebenso mit delete und free.

(Bei Klassen kommen noch Konstruktor/Destruktor dazu, die werden nur von new/delete gemacht.
malloc/free würden nur die erforderliche Byteanzahl reservieren/freigeben, ohne zwischen irgendwelchen Datentypen zu unterscheiden).

Nur mit realloc gibts eben Probleme (wobei du das bei einer Liste sowieso nicht brauchen kannst).
Will man zB zusätzlichen Speicher dazunehmen und es ist direkt hinter dem aktuellen nichts mehr frei, wird das ganze Array (egal ob 1 oder 1000000 Elemente) woanders hinkopiert....unglaublich ressourcenschonend.
Aber bei einer Liste kannst du das wahrscheinlich sowieso nicht brauchen.
 
Zurück