Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Cache Kohärenz

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
25.05.2007, 00:33 Uhr
mike
Pinguinhüpfer
(Operator)


Hallo

Ich habe eine Frage zu den Standardlib Containern. Warum sagt man dass die std::list eine schlechte Cache Kohärenz hat und man lieber vectoren verwenden soll? Ist das nur / oder evntl. nicht der Fall bei der STL Version von SGI?

Danke im Voraus
lg
--
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
25.05.2007, 02:31 Uhr
0xdeadbeef
Gott
(Operator)


std::vector verwaltet die Daten in einem zusammenhängenden Speicherbereich. Das heißt, solange die Vektorlänge die Cachegröße nicht übersteigt, kann ein vielbenutzter Vektor leicht im Cache vorgehalten werden. Bei Listen ist das nicht der Fall, weil jedes Element in einem völlig anderen Speicherbereich liegt und vom Kernel einzeln betrachtet wird - das heißt, lediglich oft referenzierte Elemente werden im Cache gehalten, und das bringt dir auch nur dann was, wenn du dir die Iteratoren merkst.

Prinzipiell ist die Entscheidung, ob man Vektoren oder Listen benutzen sollte, aber vom use case abhängig. Bei großen Containern greift das Cache-Argument generell nur so halb, und wenn du zum Beispiel oft Elemente in die Mitte des Vektors/der Liste einfügen musst, ist ein Vektor denkbar ungeeignet.

Im Zweifel empfiehtl sich, nen Profiler anzuschmeißen und zu kucken, was der sagt.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
25.05.2007, 07:42 Uhr
mike
Pinguinhüpfer
(Operator)


Vielen Dank für die Antwort. Welcher Cache ist da gemeint? L1/L2?

Wie bereits von dir erwähnt - ich habe das eben wegen den Anwendungsbereichen nicht verstanden: Ich habs mir so gemerkt:
* vector - pushen und schnelles iterieren
* List - überall O(1) einfügen aber langsames iterieren

Darum finde ich die Aussage allgemein irgendwie komisch weil das ja 2 komplett andere Dinge sind.


Zitat:

vom Kernel einzeln betrachtet wird - das heißt, lediglich oft referenzierte Elemente werden im Cache gehalten, und das bringt dir auch nur dann was, wenn du dir die Iteratoren merkst.



Das wär meine nächste Unklarheit Stimmt folgende Aussage: So lange ich kein Element einfüge, lösche oder die Liste auf irgendeine Art und weise ändere ist garantiert das der iterator gültig bleibt trotz interner Optimierungen (kopieren etc)?

Danke i.V.
lg
--
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
25.05.2007, 08:32 Uhr
Blubber2063



Welche Cashstufe ist dabei eigentlich egal, es geht ja darum das vom Cache immer ganze Blöcke vorrausgeladen werden, ist der Speicher Linear wie beim Vector, dann ist die Wahrscheinlichkeit bei kleinen Vectoren das sie komplett im Cache liegen größer.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
25.05.2007, 22:24 Uhr
mike
Pinguinhüpfer
(Operator)


Danke - jetzt ist mir der Grund einwenig klarer

Danke
lg
--
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: