Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

11

29.11.2011, 13:23

Auch wenn dir das Kapitel mit den Zeigern sicherlich weiterhelfen wird, so solltest du trotzdem std::string verwenden. Sie wurde ja nicht ohne Grund entwickelt (und zum Standard erklärt):
  • Speicherverwaltung
  • Kopier- und Zuweisungsoperatoren
  • uvm.
Darüber hinaus existiert die Methode const char* std::string::c_str() const, welche du nutzen solltest, wenn eine andere API einen CString (const char*) erwartet. Es besteht hier kein Grund, auf nackte CStrings zu setzen.

Grüße ... Heiko

Zitat

Ich bin nicht der Messias.
Ich sage, du bist es, Herr. Und ich muss es wissen, denn ich bin schon einigen gefolgt.

https://bitbucket.org/bwbg

12

29.11.2011, 19:00



Auch wenn dir das Kapitel mit den Zeigern sicherlich weiterhelfen wird, so solltest du trotzdem std::string verwenden. Sie wurde ja nicht ohne Grund entwickelt (und zum Standard erklärt):
SpeicherverwaltungKopier- und Zuweisungsoperatorenuvm.Darüber hinaus existiert die Methode const char* std::string::c_str() const, welche du nutzen solltest, wenn eine andere API einen CString (const char*) erwartet. Es besteht hier kein Grund, auf nackte CStrings zu setzen.

Grüße ... Heiko
Außer vielleicht, dass std::string-Objekte verdammt langsam sind. Die Klasse hätte wohl eher die Bezeichnung std::string_builder verdient.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

13

29.11.2011, 19:08

Äh, wa? In welchen Momenten genau ist std::string denn langsam? Also ich meine in welcher praktischen Situation macht sich da Performance irgendwie bemerkbar?
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Sylence

Community-Fossil

Beiträge: 1 663

Beruf: Softwareentwickler

  • Private Nachricht senden

14

29.11.2011, 20:19

Gibts da in der optimierten Fassung am Ende überhaupt einen Unterschied?

15

29.11.2011, 20:37

Nicht, dass das für den vorliegenden Anwendungsfall eine Rolle spielte. Die CPU langweilte sich selbst im Debug-Build ...

Natürlich kann die std::string-Objekte so langsam wie möglich verwenden, wenn man diese bei Funktionsaufrufen kopiert, statt per Referenz zu übergeben. CStrings wären jedoch genau so langsam, wenn man diese vor jedem Funktionsaufruf kopierte (Länge ermitteln, Speicher alloziieren, kopieren).

Ein String-Builder wäre wohl eher std::stringstream . :D

Grüße ... Heiko

Zitat

Ich bin nicht der Messias.
Ich sage, du bist es, Herr. Und ich muss es wissen, denn ich bin schon einigen gefolgt.

https://bitbucket.org/bwbg

16

30.11.2011, 20:50

Natürlich kann die std::string-Objekte so langsam wie möglich verwenden, wenn man diese bei Funktionsaufrufen kopiert, statt per Referenz zu übergeben. CStrings wären jedoch genau so langsam, wenn man diese vor jedem Funktionsaufruf kopierte (Länge ermitteln, Speicher alloziieren, kopieren).
Nein, das hat damit wirklich nichts zu tun... die std::strings sind bei sehr großen Zeichenketten ziemlich träge. Das liegt unteranderem daran, dass diese Klasse nicht ganz dem Konzept eines Strings entspricht. So sind Strings in jeder anderen Sprache Java, C#, D... anders aufgebaut. Ein String sollte sich selbst nämlich nicht manipulieren und verändern dürfen, sondern sollte immer einen konstanten nicht veränderbaren Wert haben. Anstatt den eigenen String zu verändern sollte nämlich ein neuer erzeugt werden. So aber liegen die Strings in C++ anderen Implementierungen andere sprachen sehr hinterher:
http://d-programming-language.org/cppstrings.html

In seinem Fall sollte das natürlich nicht von Nachteil sein, aber wenn man mal mit 2GB großen Zeichenketten zu tun haben sollte...

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

17

30.11.2011, 21:03

Sorry, aber 2GB große Zeichenketten zu verwenden kann einfach nicht performant sein. Da braucht man sich auch nicht wundern.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

18

30.11.2011, 23:31

Musste mal nen 2GB Logfile checken. Da dass natürlich zu viele Zeilen waren, habe ich nen Parser geschrieben, der unwichtige Zeilen löscht und somit Schritt für Schritt die Datei gekürzt. Da war das nun wichtig. Da hat Laufzeit aber auch keine allzu große Rolle gespielt, da das ganze halt einmalig von mir eingesetzt wurde;) Ich denke auch, dass 2GB Strings nicht der Normalfall sind. Vor allem in diesem Beispiel ist der Hinweis quatsch. Und welche Implementierung eines Strings nun optimal ist kommt auch immer auf das Einsatzgebiet an. Wenn du nun mit deinem 2GB String arbeiten möchtest und in diesem ein paar Zeilen ändern möchtest ist es auch nicht besonders toll, wenn dein String erst wieder komplett neu erstellt wird. Geht aber erst mal um das Thema hier und da sollte er nun mal auf die String Klasse zurück greifen.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

19

01.12.2011, 16:24

Arr. Ja meine Formulierung ist hier etwas unglücklich verlaufen, das gebe ich zu. Und es stimmt auch, dass es direkt für dieses Beispiel natürlich nicht relevant ist. Aber: das mit dem 2GB-String war nur ein Extrem-Beispiel, ich bin mir nämlich sicher, dass „string-manipulier-intensive“ Algorithmen mit einer anderen String-Implementierung spürbar schneller wären. Im D vs. C++-Benchmark jedenfalls waren D-Strings doppelt so schnell, was nicht unbedingt für den std::string spricht ;)

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

20

01.12.2011, 17:22

Genau genommen kann man kein "D vs C++" durchführen, sondern nur Compiler und Laufzeitbibliotheken miteinander vergleichen. C++ ist ja nur die Sprache, Compiler gibt es viele.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Werbeanzeige