Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
quas4
Založen: 18. 10. 2007 Příspěvky: 199
|
Zaslal: 25. prosinec 2007, 15:18:23 Předmět: |
|
|
k tematu:
kraticky priklad a vysvetleni pomoci iostream zde:
http://www.parashift.com/c++-faq-lite/misc-technical-issues.html#faq-39.1
rezna napsal: |
mno ono zalezi jestli chces prevest jenom int-to-string a nebo chces ten int naformatovat nekam doprostred stringu
pokud chces to prvni pak OK
ale pokud nekdo chce vypsat treba
"Vase skore je 50."
tak je s(n)printf() tisickrat vhodnejsi, protoze v tomhle pripade psat kod
kód: |
vypis("Vase skore je ");
str = preved_int_na_string(50);
vypis(str);
vypis("."); |
je a) neprehledny b) nutne pomaly
a to nedejboze jestli to nebude jeste takto
kód: |
str = "Vase skore je ";
str += itoa(50);
str += ".";
vypis(str); |
kde se treba nutne budou kopirovat (nebo minimalne reallocovat) buffery. to je uplna silenost
nutne tedy vitezi ten sprintf() ktery je elegantni. |
ad a) std::string str a = "Vase skore je " + stringify(50) + "."; je neprehledne?
ad b) std::string ne vzdy pri pouziti +, +=, append() realokuje a kopiruje pamet. Viz STL dokumentace a metoda capacity() - konkretni implementace se odviji od verze STL ("grow policy" neni vyhradne urcena standardem).
Pozn: pozor, netvrdim ze pouziti printf() je vzdy spatne.. |
|
Návrat nahoru |
|
 |
Marek

Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 26. prosinec 2007, 06:54:32 Předmět: |
|
|
Když už se tady bavíte o rychlosti...
Kdyby někomu vadilo, že se string realokuje, dá se použít jeho metoda reserve a tím tomu zamezit. Nutno podotknout, že string má hodně podobný vlastnosti jako vector<char> a tedy operátor += je rychlejší než + (podobně jako push_back oproti kopii celého vectoru). BTW zkoušel jsem na VC++ otestovat rychlost string::operator+=(const char*) vs ostringstream::operator<<(const char*) a jako rychlejší mi vyšel string. _________________ AMD Open Source Graphics Driver Developer |
|
Návrat nahoru |
|
 |
rezna
Založen: 27. 07. 2007 Příspěvky: 2156
|
Zaslal: 26. prosinec 2007, 10:11:39 Předmět: |
|
|
quas4 napsal: |
ad a) std::string str a = "Vase skore je " + stringify(50) + "."; je neprehledne? |
ano prijde mi to dostatecne neprehledne a za mnohem vice prehledne povazuji .NETove String.Format() ktere jsem si jeste upravil pro svuj projekt v COMu jako
FormatTextByTemplate("Vase skore je {skore}.", "skore", 50); |
|
Návrat nahoru |
|
 |
rezna
Založen: 27. 07. 2007 Příspěvky: 2156
|
Zaslal: 26. prosinec 2007, 10:13:44 Předmět: |
|
|
Eosie napsal: |
Když už se tady bavíte o rychlosti... |
na rychlost je samozrejme nejvhodnejsi trida podobna .NETovemu StringBuilderu - tedy neco co neni optimalizovane na samotnou praci se stringem, ale na buildovani delsich retezcu |
|
Návrat nahoru |
|
 |
Marek

Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 27. prosinec 2007, 07:48:05 Předmět: |
|
|
StringBuilder tam je proto, že stringy jsou immutable, tzn. jejich spojování je pomalé - vyžaduje opakované vytváření a kopírování stringu. (čerpám z toho, co vím z Javy) Jenomže v C++ jsou mutable a tedy samotná třída je už optimalizovaná pro editaci. Zkusil jsem udělat nějaké testy a string+= společně s reserve je fakt hodně rychlý, skoro jako char* (a to se ještě nesmí použít strlen, aby char* nebyl v nevýhodě, protože string::length má složitost O(1)). _________________ AMD Open Source Graphics Driver Developer |
|
Návrat nahoru |
|
 |
rezna
Založen: 27. 07. 2007 Příspěvky: 2156
|
Zaslal: 27. prosinec 2007, 09:46:30 Předmět: |
|
|
eosie: OK - je fakt ze nejvice pracuju s BSTR ktery prave trpi stejnym problemem jako String v .NETu, tedy pro spojovani se vzdy musi alokovat a to presne.
na druhou stranu maji tu vyhodu v rychlem strlen() resp. ::SysStringLen() |
|
Návrat nahoru |
|
 |
|