std::stack langsam?
-
Hi,
ich merke grade das std::stack sehr langsam ist! Wenn ich push aufrufe wird speicher neu allokiert und der alte hin kopiert sowie +1 hinzugefügt. Bei delete andersrum.
Das ist auf Dauer sehr langsam und jagt in meinem Spiel die FPS regelrecht in den Keller
wieso hat der std::stack keine reserve-Funktion wie vector? und wie kann ich es schaffen das std::stack schneller wird (andere techniken?)?
Oder muss ich sogar einen eigenen std::stack nachcoden, der intern einen std::vector oder std::list hat der den speicher für den genutzten speicher schon vorallokiert hat?
-
Nabend,
ein reserve gibt es nicht. In deinem Fall wuerde ich wohl einen eigenen Stack
schreiben. Je nachdem, um was fuer Objekte es sich handelt, solltest du dir
ueberlegen, ob der Stack ueberhaupt eine geeignete Datenstruktur ist, oder ob
eine andere nicht besser waere.mfg
v R
-
Also std::stack wäre für das was ich vorhabe am logischsten, da nur das Oberste auf dem Stapel aktiv sein soll und die unteren müssen warten bis der Stapel abgearbeitet wurde, deshalb nahm ich std::stack.
Es handelt sich in einem fall nur um std::basic_string<eigener_datentyp> und im anderen fall um strukturen.
-
Speicherst du Kopien?
mfg
v R
-
Wie benutzt du den Stack? Legst du jedesmal einen neuen Stack an, wenn du einen brauchst, oder hast du nur einen einzigen Stack?
-
Ich habe 2 Stacks ganz normale stacks die das ganze programm über in 2 singletons sind.
das 1. ist nur um strings abzuspeichern, das andere für klassen.
Und nein ich speichere keine kopien und lege auch nicht immer einen neuen stack an. ich benutze nur push, pop und top.
-
std::stack ist ein container adapter. du kannst auch einen vector, list, deque, etc. als implementierung verwenden. standardmäßig ist stack per deque implementiert.
falls wirklich jedesmal neu allokiert werden sollte, würde ich mir ernsthaft sorgen um die STL implementierung machen (uU ein Bug)
ich nehme aber einfach an, dass du stack falsch verwendest
-
Was kann man denn am Stack falsch machen? für wie blöde hälste mich eigentlich? glaubste net das bei einem push neuer speicher angelegt wird? hä?
Gucks dir doch gefälligst selber an.
-
Shade Of Mine schrieb:
std::stack ist ein container adapter. du kannst auch einen vector, list, deque, etc. als implementierung verwenden. standardmäßig ist stack per deque implementiert.
falls wirklich jedesmal neu allokiert werden sollte, würde ich mir ernsthaft sorgen um die STL implementierung machen (uU ein Bug)
Nimmt man die Beschreibung von sgi.com als Grundlage, so ist das in der Tat der
Fall, wobei ich mir bis jetzt noch nicht die muehe gemacht habe, das selbst
zu testen.[edit]
ist ja lediglich size, welches +1 hoch geht (logischer weise). Das hat natuerlich
nicht zwangsmaessig was mit dem reservierten Speicher zu tun.
[/edit]mfg
v R
-
***************+ schrieb:
Was kann man denn am Stack falsch machen? für wie blöde hälste mich eigentlich? glaubste net das bei einem push neuer speicher angelegt wird? hä?
Eigentlich wollte ich hier aufhören zu lesen, aber...
***************+ schrieb:
Gucks dir doch gefälligst selber an.
...das hier ist ja wohl der Gipfel. Wer hat denn hier ein Problem? Ich denke Shade ist es ziemlich egal ob dein Programm funktioniert oder nicht. Hilfreich wäre auch zu wissen woran du festmachst, dass tatsächlich neuer Speicher angefordert und umkopiert wird. Hast du die Implementierung angeschaut?
-
***************+ schrieb:
Was kann man denn am Stack falsch machen? für wie blöde hälste mich eigentlich? glaubste net das bei einem push neuer speicher angelegt wird? hä?
Gucks dir doch gefälligst selber an.
Darf alle Forumsteilnehmer bitte, nicht weiter versuchen hier zu helfen. Danke.
-
Inkompetenter Mod, erst einen auf Dicke Eier machen und dann zu stolz sein zu sehen das er falsch liegt. Typisch.
-
du kannst bei std::stack bestimmmen was für eine Art Container darunter liegen soll. Nimm einfach std::list. Damit hast du eine doppelt verkettete Liste, bei der Speicher + 1 beim pushen nicht für alle bestehenden Elemente neu alloziert wird.
Zum Beispiel:
std::stack<int, std::list<int> >
-
Shade Of Mine du bist bestimmt ein ****** Hip Hopper.
-
mit std::stack hatte ich noch nie Probleme.
Bei mir lauft es super/perfekt/geil/atemberaubend/...Mmmm, std::stack ist doch keine std::map!
std::stack<int, std::list<int> > bla;
Geht das???
MFG Ghost