C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Re: std::string oder const char *?
Goto page 1, 2, 3  Next
 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German)
View previous topic :: View next topic  
Author Message
Hendrik Belitz
Guest





PostPosted: Mon Nov 10, 2003 12:32 pm    Post subject: Re: std::string oder const char *? Reply with quote



Mark Henning wrote:

Quote:
Moin!

War gerade dabei, ein Datei-Kopierroutine mit Fehlerbehandlung zu
basteln. Da ist mir dann die Frage gekommen:

bool CopyFile (const char * szInFile, const char * szOutFile);

oder nicht doch eher

bool CopyFile (std::string strInFile, std::string strOutFile);

Bei Variante 1:
Vorteil: Bibliothekenunabhängig
Nachteil: u.U. Übergabe zerstörter Strings, ungültiger Pointer
etc.pp., nicht Multi-Threading-sicher

Bei Variante 2:
Vorteil: Keine Probleme mit Buffer-Overflows, ungültigen Pointern
etc.pp., Multi-Threading-sicher
Nachteil: Bibliothekenabhängig,

std::string gehört zur Standardbibliothek. Deshalb zieht dieses Argument
nicht (Selbst für Compiler, die diese immer noch nicht mitliefern, kann
man sich entsprechende Libs frei aus dem Netz ziehen).

Quote:
evtl. werden unnötige String-Kopien erzeugt

Mit Sicherheit. Aber das läßt sich ändern, wenn man die Strings einfach als
const - Referenz übergibt:

bool CopyFile (const std::string& strInFile, const std::string& strOutFile);

Quote:
Wovon macht ihr es abhängig, ob ihr Strings als const char *, (const)
std::string &, (const) std::string * oder (const) std::string
übergebt? Welche Aspekte haben die einzelnen Varianten außer den von
mir oben aufgeführten sonst noch?

1. const char*: Das sollte so langsam wirklich der Vergangenheit angehören.
2. const std::string&: Das sollte für beinahe jede Situation die beste
Lösung sein.
3. const std::string*: Nur verwenden, wenn man eh nur einen Zeiger auf einen
String hat. Und selbst dann dürfte eine Übergabe wie in 1. besser sein.
4. const std::string: Praktikabel, aber ineffizient (wg. Erzeugung lokaler
Kopien)
--
Dipl.-Inform. Hendrik Belitz
Central laboratory of electronics
Research center Juelich

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
André Pönitz
Guest





PostPosted: Mon Nov 10, 2003 1:05 pm    Post subject: Re: std::string oder const char *? Reply with quote



Mark Henning <n1234w5678s (AT) homolog (DOT) de> wrote:
Quote:
Moin!

War gerade dabei, ein Datei-Kopierroutine mit Fehlerbehandlung zu
basteln. Da ist mir dann die Frage gekommen:

bool CopyFile (const char * szInFile, const char * szOutFile);

oder nicht doch eher

bool CopyFile (std::string strInFile, std::string strOutFile);


Ich kann die wenigsten Deiner Argumente nachvollziehen.

Quote:
Bei Variante 1:
Vorteil: Bibliothekenunabhängig

Ist in der Standard-Bilbliothek. Viel besser wird's nicht.

Quote:
Nachteil: u.U. Übergabe zerstörter Strings, ungültiger Pointer
etc.pp.,

Hmja.

Quote:
nicht Multi-Threading-sicher

Wieso?

Quote:
Bei Variante 2:
Vorteil: Keine Probleme mit Buffer-Overflows, ungültigen Pointern
etc.pp., Multi-Threading-sicher

Wieso?

Quote:
Nachteil: Bibliothekenabhängig,

Wieso?

Quote:
evtl. werden unnötige String-Kopien erzeugt

Nimm doch Referenzen.

Quote:
Wovon macht ihr es abhängig, ob ihr Strings als const char *, (const)
std::string &, (const) std::string * oder (const) std::string
übergebt? Welche Aspekte haben die einzelnen Varianten außer den von
mir oben aufgeführten sonst noch?

Normalerweise std::string (als 'std::string const &') es sei denn mein
Profiler erzaehlt mir, dass es eine sehr schlechte Idee ist.

[Wozu sollten Zeiger auf std::string gut sein?]

Andre'

--
Those who desire to give up Freedom in order to gain Security, will not have,
nor do they deserve, either one. (T. Jefferson or B. Franklin or both...)

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Hannah Schroeter
Guest





PostPosted: Mon Nov 10, 2003 1:12 pm    Post subject: Re: std::string oder const char *? Reply with quote



Hallo!

Hendrik Belitz <h.belitz (AT) fz-juelich (DOT) de> wrote:
Quote:
[...]

1. const char*: Das sollte so langsam wirklich der Vergangenheit angehören.
2. const std::string&: Das sollte für beinahe jede Situation die beste
Lösung sein.
3. const std::string*: Nur verwenden, wenn man eh nur einen Zeiger auf einen
String hat. Und selbst dann dürfte eine Übergabe wie in 1. besser sein.

Du meintest sicher "wie in 2.". Zeiger verwende ich dann, wenn ich als
sinnvolle Möglichkeit "keine Angabe" AKA (foo*) 0 zulassen will.

Quote:
[...]

Gruß,

Hannah.

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Stefan Reuther
Guest





PostPosted: Mon Nov 10, 2003 1:26 pm    Post subject: Re: std::string oder const char *? Reply with quote

Hallo,

Hendrik Belitz <h.belitz (AT) fz-juelich (DOT) de> wrote:
Quote:
Mark Henning wrote:
[Parameterübergabe std::string]
evtl. werden unnötige String-Kopien erzeugt

Mit Sicherheit. Aber das läßt sich ändern, wenn man die Strings einfach als
const - Referenz übergibt:

bool CopyFile (const std::string& strInFile, const std::string& strOutFile);

Das ist mitnichten immer effizienter, und hängt stark von der
Implementation des Compilers ab. Nehmen wir als Beispiel mal den
gcc:

Referenzübergabe:
(+) [allgemein] sehr effizient, wenn der Parameter bereits in
Form eines fertigen std::string-Objektes vorliegt.
(-) [gcc] ineffizient, wenn der Parameter erst konstruiert
werden muss (z.B. aus einem Literal). In dem Fall
konstruiert der Aufrufer ein Temporary, und destruiert es
auch wieder.
(-) [allgemein] Aliasing-Problematik.
void foo(std::string& s, const std::string& r) {
s = r + "x";
assert(s == r + "x"); // knallt, wenn &s == &r
}

Übergabe als Kopie:
(+) [gcc] effizient, wenn ein Literal übergeben wird. Dann
konstruiert der Aufrufer das Temporary und der aufgerufene
zerstört es. Im Gegensatz zur Referenzübergabe fällt also
der Destruktor-Code nur einmal an.
(+) [gcc] sehr effizient, wenn das Ergebnis eines Funktions-
aufrufes übergeben wird (`f(g());'). Dann konstruiert die
innere Funktion (g) das Ergebnis direkt in den Parameter-
slot der äußeren Funktion (f) hinein - null overhead.
(-) [allgemein] ineffizienter bei Kopien.

Allerdings muß ich sagen, daß zumindest bei meinen Anwendungen
der Performance-Flaschenhals nicht std::string (bzw. mein sogar
noch langsamerer Nachbau) ist. Da zumindest im gcc Übergabe als
Kopie selten bzw. wenig langsamer ist, aber oft weniger Code
generiert, tendiere ich dazu, std::string direkt zu übergeben.
Außerdem vermeidet das Aliasing-Probleme.

Quote:
Wovon macht ihr es abhängig, ob ihr Strings als const char *, (const)
std::string &, (const) std::string * oder (const) std::string
übergebt? Welche Aspekte haben die einzelnen Varianten außer den von
mir oben aufgeführten sonst noch?

1. const char*: Das sollte so langsam wirklich der Vergangenheit angehören.

Kommt drauf an. Wenn es nur darum geht, den String an eine
C-Bibliotheksfunktion bzw. OS-API weiterzuleiten, oder um
irgendwelche argv-Strings zu parsen, ist std::string Overkill.

Quote:
2. const std::string&: Das sollte für beinahe jede Situation die beste
Lösung sein.

Das ist m.M.n. so pauschal eben nicht richtig.


Stefan

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Dirk Clemens
Guest





PostPosted: Mon Nov 10, 2003 2:52 pm    Post subject: Re: std::string oder const char *? Reply with quote

Mark Henning wrote:
Quote:
Moin!

War gerade dabei, ein Datei-Kopierroutine mit Fehlerbehandlung zu
basteln. Da ist mir dann die Frage gekommen:

bool CopyFile (const char * szInFile, const char * szOutFile);

Ich verwende dieses, wenn mich nur ein Zeiger auf die Textstelle
interessiert oder 0 explizit erlaubt sein soll.
Ersteres ist z.B. der Fall, wenn ich die Zeiger nur
an eine Funktion weiterleite, die auch const char * erwartet.

Diese Übergabe ist sehr effizient.

Quote:

oder nicht doch eher

bool CopyFile (std::string strInFile, std::string strOutFile);

Dieses verwende ich, wenn ich auf der Kopie aurbeiten will.


bool CopyFile ( const std::string &strInFile, const & std::string strOutFile);

Und dieses verwende ich, wenn ich in der Funktion ein Objekt der
Klasse std::string benötige, aber nur lesend.


Quote:

Bei Variante 1:
Vorteil: Bibliothekenunabhängig

gilt für alle 3 Varianten

Quote:
Nachteil: u.U. Übergabe zerstörter Strings, ungültiger Pointer

Kappute Zeiger führen auch bei std::string zu undefiniertem Verhalten.

Quote:
etc.pp., nicht Multi-Threading-sicher

Wieso?

Quote:

Bei Variante 2:
Vorteil: Keine Probleme mit Buffer-Overflows, ungültigen Pointern

siehe oben

Quote:
etc.pp., Multi-Threading-sicher

nochmals: Wieso?

Quote:
Nachteil: Bibliothekenabhängig, evtl. werden unnötige String-Kopien
erzeugt

Läßt sich durch Verwendung von referenzen vermeiden.

Quote:
Wovon macht ihr es abhängig, ob ihr Strings als const char *, (const)
std::string &, (const) std::string * oder (const) std::string
übergebt? Welche Aspekte haben die einzelnen Varianten außer den von
mir oben aufgeführten sonst noch?

Bis dann,

- Mark

Lemmi
--
mailto: [email]dc (AT) 18xx (DOT) de[/email]
homepage: http://www.18xx.de

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Marco Budde
Guest





PostPosted: Mon Nov 10, 2003 6:59 pm    Post subject: Re: std::string oder const char *? Reply with quote

Mark Henning wrote:

Mal eines vorweg, Deine Beschreibung ist ziemlich unverständlich.
Du solltest bei Postings hier nicht nur das Interface
beschreiben, sondern auch, was die Funktion eigentlich machen
soll.

Quote:
War gerade dabei, ein Datei-Kopierroutine mit Fehlerbehandlung zu
basteln. Da ist mir dann die Frage gekommen:

Du willst hoffentlich nicht das "bool" für die Fehlerbehandlung
benutzen? Ansonsten, siehe Exceptions.

Quote:
bool CopyFile (const char * szInFile, const char * szOutFile);

An sich absolut ok.

Quote:
bool CopyFile (std::string strInFile, std::string strOutFile);

Ziemlich falsch in diesem Zusammenhang. Soll die Funktion
die Strings verändern können? Nein, also konstant machen. Wieso
übergibst Du die Objekte als Kopie? Das ist eigentlich immer
falsch. Du willst also benutzen:

bool CopyFile (const std::string &strInFile,
const std::string &strOutFile);

Und das "bool" willst Du vermutlich durch "void" + Exceptions
ersetzen.

Quote:
Nachteil: u.U. Übergabe zerstörter Strings, ungültiger Pointer

Gegen absichtliche Fehler kann man nie was machen. Von daher kein
Argument.

Quote:
etc.pp., nicht Multi-Threading-sicher

Kein wirkliches Argument.

Quote:
Vorteil: Keine Probleme mit Buffer-Overflows, ungültigen Pointern

Richtig, nebenbei ist "string" die Standardlösung und sollte
daher IHMO immer im Interface verwendet werden.

Quote:
etc.pp., Multi-Threading-sicher

Nein, das ist genauso (wenig) Thread-Safe wie die erste Lösung.
Auch hier kann z.B. ein anderer Thread die Filenamen verändern,
während "CopyFile()" arbeitet.

Das ist übrigens bei eigentlich allen Sprachen so.

Zum Thema Thread-Safety würde ich mal in den Stroustrup schauen
(oder war es bei Scott Meyers?).

Quote:
Nachteil: Bibliothekenabhängig,

Wieso? Die C++ Standardbibliothek ist bei jedem C++ Compiler
dabei.

Quote:
evtl. werden unnötige String-Kopien
erzeugt

Weil Du es falsch machst Smile.

Quote:
Wovon macht ihr es abhängig, ob ihr Strings als const char *, (const)
std::string &, (const) std::string * oder (const) std::string
übergebt?

Bis auf ganz, ganz wenige Ausnahmen machen IHMO nur zwei Varianten
Sinn:

*) Die Funktion soll den Parameter nicht ändern, also

const std::string &

*) Die Funktion soll ihn ändern, also

std::string &

cu, Marco
--
S: Minolta: Winkelsucher (VN), VC-9

E-Mail: mb-news-b<ät>linuxhaven.de
Deutsches Linux HOWTO Projekt: http://www.linuxhaven.de

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Marco Budde
Guest





PostPosted: Mon Nov 10, 2003 7:01 pm    Post subject: Re: std::string oder const char *? Reply with quote

Hannah Schroeter wrote:

Quote:
Du meintest sicher "wie in 2.". Zeiger verwende ich dann, wenn ich als
sinnvolle Möglichkeit "keine Angabe" AKA (foo*) 0 zulassen will.

Wofür soll das im Zusammenhang mit Strings gut sein? Erinnert mich
irgendwie an die grottigen WIN32 Funktion von Windows.

cu, Marco
--
S: Minolta: Winkelsucher (VN), VC-9

E-Mail: mb-news-b<ät>linuxhaven.de
Deutsches Linux HOWTO Projekt: http://www.linuxhaven.de

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Marco Budde
Guest





PostPosted: Mon Nov 10, 2003 7:15 pm    Post subject: Re: std::string oder const char *? Reply with quote

Stefan Reuther wrote:

Quote:
(-) [gcc] ineffizient, wenn der Parameter erst konstruiert
werden muss (z.B. aus einem Literal).

Solche Todschlagargument wie Performance helfen aber
nicht weiter, wenn man Programme schreibt, deren
Komplexität die von "Hello World" Programmen übersteigt.

Abstraktion und OOP kosten nun mal etwas Performance,
machen dafür größere Sourcen aber überhaupt erst möglich
(Wartbarkeit etc.).

Von daher ist der doch eher niedrige Overhead von std::string
vs. char-Array IHMO kein Argument.

Quote:
(-) [allgemein] Aliasing-Problematik.
void foo(std::string& s, const std::string& r) {
s = r + "x";
assert(s == r + "x"); // knallt, wenn &s == &r
}

Und das ist ein praktisches Problem? Willst Du also
grundsätzlich alle Parameter als Kopie übergeben? Ein Compiler
kann nun einmal nicht alle Programmierfehler abfangen.

Quote:
Übergabe als Kopie:
(+) [gcc] effizient, wenn ein Literal übergeben wird. Dann
konstruiert der Aufrufer das Temporary und der aufgerufene
zerstört es. Im Gegensatz zur Referenzübergabe fällt also
der Destruktor-Code nur einmal an.

Verstehe ich nicht. Kannst Du das mal genauer ausführen.

Quote:
(+) [gcc] sehr effizient, wenn das Ergebnis eines Funktions-
aufrufes übergeben wird (`f(g());'). Dann konstruiert die
innere Funktion (g) das Ergebnis direkt in den Parameter-
slot der äußeren Funktion (f) hinein - null overhead.

In diesem spez. Fall ja.

Quote:
1. const char*: Das sollte so langsam wirklich der Vergangenheit angehören.

Kommt drauf an. Wenn es nur darum geht, den String an eine
C-Bibliotheksfunktion bzw. OS-API weiterzuleiten, oder um
irgendwelche argv-Strings zu parsen, ist std::string Overkill.

s.o., irgendwann muß man einfach mit dem Übergang zu modernen Klassen
anfangen. Was heute noch nicht notwendig scheinen mag, erleichtert
später die Wart- und Erweiterbarkeit.

Quote:
2. const std::string&: Das sollte für beinahe jede Situation die beste
Lösung sein.

Das ist m.M.n. so pauschal eben nicht richtig.

Die Frage ist halt auch, wie die Situation aussieht, wenn Du nicht
auf einen spez. Compiler optimierst. Dein obiges f(g()) Beispiel würde
ich z.B. eher so aufbauen:

string a;
g (a);
f (a);

Insg. finde ich es keine so tolle Idee, wenn Funktionen/Methoden
Objekte erzeugen. Besser ist es IHMO, wenn sie von außen übergebenen
Objekte mit Daten füllen.

cu, Marco
--
S: Minolta: Winkelsucher (VN), VC-9

E-Mail: mb-news-b<ät>linuxhaven.de
Deutsches Linux HOWTO Projekt: http://www.linuxhaven.de

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Marco Budde
Guest





PostPosted: Mon Nov 10, 2003 7:59 pm    Post subject: Re: std::string oder const char *? Reply with quote

Mark Henning wrote:

Quote:
Wie löst Du Probleme, die beim Multithreading auftreten können?

(1) Du ein vernünftiges Design, z.B. Vermeidung von "globalen" bzw.
statischen Variablen.

(2) Durch Semaphoren.

Quote:
void Process(std::string & str)
{
// Macht irgendwas mit str
}

class CMultiThread
{
/* ... */
std::string str;
void WorksInThread1() {str = "Hallo!"; Process(str)};
void WorksInThread2() {str = "WegmitDir!"; Process(str)};
};

Wenn man mit Threads arbeitet, sollte man wissen, was man tut
(leider sehr oft nicht der Fall bzw. stark unterschätzt).
Was kann der Compiler bzw. die Sprache für Programmierfehler?

Genau solche Probleme vorab zu erkennen und dann zu behandeln,
ist die Kunst der Programmierung mit Threads. Hier würde mal
halt vor dem Aufruf eine Kopie erzeugen, wobei selbst dann
das Verhalten zufällig wäre.

IHMO sollte man Threads *sehr* sparsam einsetzen und sie dann
sehr gut in Objekte verpacken. Warum einige OS so auf Threads
stehen (z.B. Windows) ist mir bis heute unverständlich.
Oftmals sind asynchrone Funktionen viel einfacher zu benutzen.

cu, Marco
--
S: Minolta: Winkelsucher (VN), VC-9

E-Mail: mb-news-b<ät>linuxhaven.de
Deutsches Linux HOWTO Projekt: http://www.linuxhaven.de

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Torsten Robitzki
Guest





PostPosted: Mon Nov 10, 2003 8:00 pm    Post subject: Re: std::string oder const char *? Reply with quote

Mark Henning wrote:

Quote:
Hendrik Belitz (Mon, 10 Nov 2003 13:32:48 +0100) wrote:

2. const std::string&: Das sollte für beinahe jede Situation die beste
Lösung sein.


Wie löst Du Probleme, die beim Multithreading auftreten können?

Bsp.:

void Process(std::string & str)
{
// Macht irgendwas mit str
}

class CMultiThread
{
/* ... */
std::string str;
void WorksInThread1() {str = "Hallo!"; Process(str)};
void WorksInThread2() {str = "WegmitDir!"; Process(str)};

Ich war zwar nicht gefragt, aber:

void WorksInThread1() { Process("Hallo!");}
void WorksInThread2() { Process("WegmitDir!");}

Das gleiche Problem hättest Du auch mit einem C-String. Das Problem das
Du hier ins Feld führst, sind nicht synchronisierte Zugriffe auf Daten
aus mehr als einem thread.

mfg Torsten

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Marco Budde
Guest





PostPosted: Mon Nov 10, 2003 8:03 pm    Post subject: Re: std::string oder const char *? Reply with quote

Mark Henning wrote:

Quote:
Beispiel:

Das ist kein Beispiel sondern einfach schlechter Code.

Quote:
const char szText[100];

Warum ist das Objekt-global?

Quote:
void WorksInThread1() {strcpy(szText, "Hallo!");
Process(szText)};
void WorksInThread2() {strcpy(szText, "WegMitDir!");
Process(szText)};

Hier hätte man eine lokale Variable angelegt bzw. szText mit
einer Semaphore geschützt.

Quote:
Obiges Beispiel macht keine Probleme.

Blödsinn. Wenn Du szText als String genauso definierst
(Objekt-lokal) hast Du exakt das gleiche Problem.

Quote:
Nimm doch Referenzen.
Dann habe ich wieder das Problem mit dem Multithreading.

Nein.

Das ganze wird hier langsam OT. Ich würde dringend davon
abraten, am Anfang überhaupt Threads zu benutzen. Lerne erst
einmal die Sprache kennen. Threads braucht man in der Regel
eigentlich fast nie.

Ansonsten solltest Du Dich erst einmal über die Grundlagen
der Thread-Programmierung (unabhängig von der Sprache)
informieren. Die Probleme sind immer die gleichen.

cu, Marco
--
S: Minolta: Winkelsucher (VN), VC-9

E-Mail: mb-news-b<ät>linuxhaven.de
Deutsches Linux HOWTO Projekt: http://www.linuxhaven.de

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Markus Breuer
Guest





PostPosted: Mon Nov 10, 2003 11:12 pm    Post subject: Re: std::string oder const char *? Reply with quote

Mark Henning schrieb:
[...]
Quote:
Wovon macht ihr es abhängig, ob ihr Strings als const char *, (const)
std::string &, (const) std::string * oder (const) std::string
übergebt? Welche Aspekte haben die einzelnen Varianten außer den von
mir oben aufgeführten sonst noch?

Du solltest dir Gedanken darüber machen, was der Body deiner Funktion
benötigt. Wenn du innerhlab deiner Funktion mit c-strings arbeitest,
solltest du const char* vorziehen. Es macht wenig Sinn mit std::string
zu arbeiten, wenn dieser stets in const char* konvertiert werden muss.

Grundsätzlich solltest du deine Schnittstellen so designen, dass
möglichst wenige Konvertierungen notwendig sind. Wenn du vorwiegend mit
C++ arbeitest, dann wird dir const char* dort selten begegnen. Arbeitest
du mit vielen c-Bibliotheken, so macht es keinen Sinn über std::string
zu konvertieren.

Es kann durchaus Sinn machen, beide Varianten zu implementieren, dazu
schreibst du lediglich eine Wrapperfunktion.

Gruß Markus

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Michael Trocken
Guest





PostPosted: Tue Nov 11, 2003 7:21 am    Post subject: Re: std::string oder const char *? Reply with quote

Stefan Reuther <sr21 (AT) inf (DOT) tu-dresden.de> wrote

[...]
Quote:
Referenzübergabe:
[...]
(-) [gcc] ineffizient, wenn der Parameter erst konstruiert
werden muss (z.B. aus einem Literal). In dem Fall
konstruiert der Aufrufer ein Temporary, und destruiert
es auch wieder.

Du schreibst, dass der gcc hier ineffizient ist. Ist denn
in diesem Fall auch eine Optimierung denkbar?


Gruß,
Michael

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Markus Schaaf
Guest





PostPosted: Tue Nov 11, 2003 7:39 am    Post subject: Re: std::string oder const char *? Reply with quote

"Michael Trocken" <s1234569 (AT) hotmail (DOT) com> schrieb:
Quote:
Stefan Reuther <sr21 (AT) inf (DOT) tu-dresden.de> wrote in message
news:<1068469751.irz750%sr21 (AT) inf (DOT) tu-dresden.de>...
[...]
Referenzübergabe:
[...]
(-) [gcc] ineffizient, wenn der Parameter erst konstruiert
werden muss (z.B. aus einem Literal). In dem Fall
konstruiert der Aufrufer ein Temporary, und destruiert
es auch wieder.

Du schreibst, dass der gcc hier ineffizient ist. Ist denn
in diesem Fall auch eine Optimierung denkbar?

Praktisch nicht. Deshalb nimmt man für "Referenz auf Zeichenkette"
fast immer »char const *«. Rein funktional gibt es keinen Unterschied
zwischen

void f( std::string const & );

und

void f( char const * );

.... aber die zweite Variante ist häufig effizienter. Wer blanke Zeiger
nicht mag, benutzt eben sowas:

struct ZStrRef {
char const * p;
ZStrRef( std::string const & s ) : p( s.c_str() ) {}
explicit ZStrRef( char const * p_ ) : p(p_) { assert(p); }
};

void f( ZStrRef );

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Markus Schaaf
Guest





PostPosted: Tue Nov 11, 2003 11:28 am    Post subject: Re: std::string oder const char *? Reply with quote

"Rolf Magnus" <ramagnus (AT) t-online (DOT) de> schrieb:

Quote:
Das kommt drauf an.

Eigentlich nicht.

Quote:
Wenn ich umgekehrt einen std::string habe und den
erst per c_str() in einen const char* umwandeln muß, kann je nach
Implementation von std::string auch erst eine Kopie nötig werden.

Möglich, aber unwahrscheinlich, weil nicht sinnvoll.

Des weiteren ging hier um den Fall, daß die Funktion selbst eine
Referenz auf eine Null-terminierte Zeichenkette braucht. Ich nehme
natürlich immer das als Parameter, was die Funktion verarbeitet.

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German) All times are GMT
Goto page 1, 2, 3  Next
Page 1 of 3

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.