Re: std::string::data()
I believe this is a false myth. After having read several threads on
string on this newsgroup and on comp.std.c++, I came to the conclusion
that there are actually *no* industrial-strong implementation using
copy-on-write that are also fully standard compliant. I'm not saying
that such an implementation can't exist, but COW comes at a greater cost
than one may expect, especially in MT environments, so implementors
have, in time, simply decided to drop it. If I'm mistaken, please let me
know.
To the best of my knowledge, the popular GNU implementation of
basic_string uses COW (I do not know if its fully compliant with the
standard). The problem is not so much with MT (refcount may be
atomic), but rather with redundant copies (+ memory allocations)
behind the scenes, which unfortunately, many programmers are not aware
of. Consider for example the following (naive) code fragment:
std::string capitalize(const std::string& s1)
{
std::string s2(s1); // Now s1 and s2 share the same
memory.
if (s2[0] >= 'a' && s2[0] <= 'z') // Causes s2 to make a copy of
s1!
{ // s2[0] returns a reference,
and thus
s2[0] = toupper(s2[0]); // may be modified, so s2 must
have its
} // own copy, even if s1 is
already cap.
return s2; // Calls copy-constructor.
}
(See http://strinx.sourceforge.net/stdcritique.html for full
discussion).
Regards,
S.
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]