Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
TheMillenium Dark JLI'ler
Anmeldedatum: 21.07.2002 Beiträge: 1427 Wohnort: World Medaillen: Keine
|
Verfasst am: 18.09.2004, 18:31 Titel: Problem mit std::map |
|
|
Warum geht das hier nicht?
Code: | int var = 5;
map<char*,int*> test;
test["var"] = &var;
*(test["var"]) = 10; |
Will auch mal die STD::Map Funktion ausprobieren, aber da hatte ich wohl schon recht diese Funktion davor noch nicht benutz zu haben...
Ich kriege in der letzten Zeile einen Unhandled Exception Aufruf, aber nur im Debug Modus... _________________ The source of all power is in its destiny... |
|
Nach oben |
|
|
The Lord of Programming Living Legend
Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 18.09.2004, 19:55 Titel: |
|
|
Ich vermute, dass das an dem char* liegt.
Du hast ja das "var", das du der Map übergibst (wenn ich mich nicht irre) nirgendwo statisch im Speicher, sondern nur temporär.
Char* ist ja eigentlich auch nur ein Zeiger auf den ersten Char. Aber wie willst du den übergeben, wenn du ihn nur "on-the-fly" erstellst?
Wenn du es mit STL-Strings probierst, müsste es gehen. Sonst kannst du das auch mal so versuchen:
Code: | int var = 5;
char* schluessel="var";
map<char*,int*> test;
test[schluessel] = &var;
*(test[schluessel]) = 10; |
_________________ www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console
Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet... |
|
Nach oben |
|
|
TheMillenium Dark JLI'ler
Anmeldedatum: 21.07.2002 Beiträge: 1427 Wohnort: World Medaillen: Keine
|
Verfasst am: 18.09.2004, 20:27 Titel: |
|
|
Nein, denn es ist nicht temporär, sondern statisch in der Exe. Deshalb ist es das gleiche wie char string[]="var"; Das hatte ich schon davor ausprobiert und es ging nicht. Ich kriege ja auch nur im Debug Modus diese Meldung...im Release funktioniert ja alles.. _________________ The source of all power is in its destiny... |
|
Nach oben |
|
|
Hazel JLI MVP
Alter: 39 Anmeldedatum: 19.07.2002 Beiträge: 1761
Medaillen: Keine
|
Verfasst am: 18.09.2004, 21:28 Titel: |
|
|
Ein char* ist ein Zeiger und jeder neue String den du erstellst kriegt natürlich eine eigene Adresse... wenn du per String auf die Map zugreifen willst musst du schon std::string nehmen, oder einen eigenen Typen. _________________ *click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
|
|
Nach oben |
|
|
TheMillenium Dark JLI'ler
Anmeldedatum: 21.07.2002 Beiträge: 1427 Wohnort: World Medaillen: Keine
|
Verfasst am: 19.09.2004, 08:29 Titel: |
|
|
Warum funktioniert dass dann im Release Modus? Selbst wenn ich das mit 10 verschiedenen Strings(char*) ausprobiere?
std::string ist zu lahm für Spiele und häufige Aufrufe und sollte deshalb vermieden werden
(sicher&bequem aber gottverdammtlahm) _________________ The source of all power is in its destiny... |
|
Nach oben |
|
|
Kampfhund Super JLI'ler
Alter: 42 Anmeldedatum: 20.07.2002 Beiträge: 408
Medaillen: Keine
|
Verfasst am: 19.09.2004, 15:13 Titel: |
|
|
Was meinst du mit "funktioniert"?
Dass du keine Fehlermeldung bekommst?
(die map wird nach addressen sortiert und der zugriff erfolgt auch über addressen und nicht über einen string, wie Hazel bereits sagte) _________________ Kochen ist ein NP-schweres Optimierungsproblem. |
|
Nach oben |
|
|
TheMillenium Dark JLI'ler
Anmeldedatum: 21.07.2002 Beiträge: 1427 Wohnort: World Medaillen: Keine
|
Verfasst am: 19.09.2004, 15:19 Titel: |
|
|
Ja und dass die Map auch die richtigen Werte zurückliefert. Im Buch auf S.243 wird die Map aber genauso eingesetzt wie ich es mache... _________________ The source of all power is in its destiny... |
|
Nach oben |
|
|
Hazel JLI MVP
Alter: 39 Anmeldedatum: 19.07.2002 Beiträge: 1761
Medaillen: Keine
|
Verfasst am: 19.09.2004, 15:23 Titel: |
|
|
Zitat: |
std::string ist zu lahm für Spiele und häufige Aufrufe und sollte deshalb vermieden werden
(sicher&bequem aber gottverdammtlahm)
|
Was genau soll an einem STL String langsam sein? Kann ich leider nicht nachvollziehen... und was hast du denn damit vor, dass Strings in deinem Programm zum Performancebottleneck werden könnten.. ? _________________ *click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
|
|
Nach oben |
|
|
TheMillenium Dark JLI'ler
Anmeldedatum: 21.07.2002 Beiträge: 1427 Wohnort: World Medaillen: Keine
|
Verfasst am: 19.09.2004, 15:30 Titel: |
|
|
RPG, ScriptEngine, die muss ja viel mit Strings machen.
strings überprüfen z.B. andauernd ob jeder Befehl im erlaubten Speicherbereich stattfindet,etc... Sagen wir ich brauche so im Schnitt 5 if Abfragen mehr, dadurch aber auch 2*5 Aufrufe von Variablen. Das wären dann 15 Befehle mehr alles nur ~ , ich verarbeite pro Sekunde ~600 Strings --> 600*15 = 9000 zusätzliche Befehle in der SEKUNDE!! -- Nein, DANKE!
Will ja keinen Frameeinbruch haben, die Grafik schluckt heutzutage eh keine Frames mehr, aber die Kollison schon und weil ne ScriptingEngine nur ein Zusatz ist und den braucht man ja in echt nicht, soll der mir nicht 20fps kosten... _________________ The source of all power is in its destiny... |
|
Nach oben |
|
|
Hazel JLI MVP
Alter: 39 Anmeldedatum: 19.07.2002 Beiträge: 1761
Medaillen: Keine
|
Verfasst am: 19.09.2004, 15:33 Titel: |
|
|
Das hat mal ein GDNet Mod von sich gegeben:
Code: |
Well, a few misconceptions here that I see.
The first being that std::string is slow. How on earth did you arive at that? It's no slower than using a c-string, except that it will handle re-allocation for you. You can set it's size when you create it, and thus avoid re-allocation if you want. It's indexing operator ([]) provides constant time access (and is in every sense of the word the exact same thing as using a c-string indexer). Using the at method gives you bounds checked safety as well, something you don't get with c-strings, unless you write it. Your compiler will most often optimize out the indexer use in release mode.
Looking over the examples provided, you can already see how easy it is to fuck up with c-strings. Simple things such as delete vs delete[], exception safety, hell, even how to reallocate a c-string.
Not to mention, most standard library writers have a few tricks up their sleaves, things like having COW strings, and non-COW for MT.
As long as you use references, and const references wherever you can, you will not have any overhead due to copies, and it's the same thing as you would be doing with the c-string. As far as file access goes, believe me, you should be more worried about the speed of the disk. Not to mention, there are plenty of string operations for reading from a disk if you are using the STL.
|
_________________ *click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
|
|
Nach oben |
|
|
Hazel JLI MVP
Alter: 39 Anmeldedatum: 19.07.2002 Beiträge: 1761
Medaillen: Keine
|
Verfasst am: 19.09.2004, 15:34 Titel: |
|
|
TheMillenium hat Folgendes geschrieben: | RPG, ScriptEngine, die muss ja viel mit Strings machen.
strings überprüfen z.B. andauernd ob jeder Befehl im erlaubten Speicherbereich stattfindet,etc... Sagen wir ich brauche so im Schnitt 5 if Abfragen mehr, dadurch aber auch 2*5 Aufrufe von Variablen. Das wären dann 15 Befehle mehr alles nur ~ , ich verarbeite pro Sekunde ~600 Strings --> 600*15 = 9000 zusätzliche Befehle in der SEKUNDE!! -- Nein, DANKE!
Will ja keinen Frameeinbruch haben, die Grafik schluckt heutzutage eh keine Frames mehr, aber die Kollison schon und weil ne ScriptingEngine nur ein Zusatz ist und den braucht man ja in echt nicht, soll der mir nicht 20fps kosten... |
Genau darum werden Scripts in Bytecode kompiliert, bevor man sie verarbeitet und strcmp ist auch nicht schneller als der Überladene == Operator für strings. ;) _________________ *click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
|
|
Nach oben |
|
|
Hazel JLI MVP
Alter: 39 Anmeldedatum: 19.07.2002 Beiträge: 1761
Medaillen: Keine
|
|
Nach oben |
|
|
TheMillenium Dark JLI'ler
Anmeldedatum: 21.07.2002 Beiträge: 1427 Wohnort: World Medaillen: Keine
|
Verfasst am: 19.09.2004, 15:42 Titel: |
|
|
Mhhh das ist einer gegen Viele. Ich habe oft auf Techseiten gelesen dass std::string sehr lahm sein soll und jetzt spricht einer dagegen...dabei weiß ich weder was GDNet ist noch ob der Mod genug Referenzen hat, dass er wirklich das Wissen hat um gerechtfertigt das sagen zu können....
Ich habe immer nur auf den Seiten gelesen, wenn man kein Anfänger ist und mit chars umgehen kann, soll man chars benutzen wenn man Performance braucht. Will man immer auf der sicheren Seite stehen, sollte man doch std::string benutzen...
Ich kenne eh kaum Vorteile von std::string, ich kenne nur diese:
1. sicherer weil, keine Neuallokierung, schreibt immer auf zugelassene Speicherbereiche, kümmert sich um Deallkierung,..
2. überladener + Operator
Ich bin schon langsam dabei die std dort zu benutzen wo ich es für sinnvoll halte...aber vllt finde ich ja einen Beitrag dazu mal in der MSDN oder in nem Programmierbuch über STD... _________________ The source of all power is in its destiny... |
|
Nach oben |
|
|
Hazel JLI MVP
Alter: 39 Anmeldedatum: 19.07.2002 Beiträge: 1761
Medaillen: Keine
|
Verfasst am: 19.09.2004, 17:02 Titel: |
|
|
Ja aber jetzt wo du mir erklärt hast was du damit willst, frag ich mich wieso char* schneller sein soll als string? Hört sich an als würdest du sie nur oft vergleichen. _________________ *click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
|
|
Nach oben |
|
|
TheMillenium Dark JLI'ler
Anmeldedatum: 21.07.2002 Beiträge: 1427 Wohnort: World Medaillen: Keine
|
Verfasst am: 19.09.2004, 17:56 Titel: |
|
|
Ja, aber dann muss ich ja immer c_str() oder wie das heißt auch verwenden um sie zu vergleichen und das würde ja dann auch langsamer, oder?
Also wenn ich sie nur vergleiche und sie von meiner Klasse verwalte die chars dann kann ja nichts passieren und ich brauche ja damit auch die std::string Funktionalitäten gar nicht, die Exe bleibt kleiner wegen den Header, weniger Speicherverbrauhc die Methoden müssen auch nciht geladen werden...
Also so gravierend wir der Unterschied wahrscheinlcih in einem herkömmlichen Projekt nicht sein, nur wenn man hunderte strings gleichzeitig pro Sekunde aufruft kann das etwas schon etwas Gewaltiges ausmachen. _________________ The source of all power is in its destiny... |
|
Nach oben |
|
|
|