Jason House wrote:
Andrei Alexandrescu Wrote:
Sergey Gromov wrote:
Sat, 07 Mar 2009 15:19:50 -0800, Andrei Alexandrescu wrote:
To recap, if an API takes a string and all you have a char[], DO NOT
CAST IT. Call .idup - better safe than sorry. The API may evolve and
store a reference for later. Case in point: the up-and-coming
std.stdio.File constructor initially was:
this(in char[] filename);
Later on I decided to save the filename for error message reporting and
the such. Now I had two choices:
(1) Leave the signature unchanged and issue an idup:
this.filename = to!string(filename); // issues an idup
(2) Change the signature to
this(string filename);
Now all client code that DID pass a string in the first place (the vast
majority) was safe _and_ efficient. The minority of client code was that
that had a char[] or a const(char)[] at hand. That code did not compile,
so it had to insert a to!string on the caller side.
As has been copiously shown in other languages, the need for
character-level mutable string is rather rare. So most of the time you
will not traffic in char[], but instead you'll have a immutable(char)[]
to start with. This further erodes the legitimacy of your concern.
My file names are constructed most of the time. And most of the time
they are simple char[]s.
Ehm. Mine are also constructed, but somehow come in string format, e.g.:
string basename;
...
auto f = File(basename ~ ".txt");
It is not obvious that File should store the file name. It's not
strictly necessary. It's an *implementation detail.* Now you expose
this implementation detail through the class interface, and you do this
without any good reason. You save a 150 byte allocation per file.
Nice.
It's just an example, the point being that there things are always fast
and safe. In many cases there's much more at stake and you can't rely on
idioms that allocate memory needlessly.
Your example above does allocate memory. A mutable string could potentially avoid
allocating to append ".txt"
It does, and for a good reason - File stores an alias of it. If it
didn't have to, it would have accepted const, in which case a mutable
string would have sufficed.
Andrei