cast(immutable) vs extra variable
Jonathan M Davis
jmdavisProg at gmx.com
Thu Sep 19 13:05:24 PDT 2013
On Thursday, September 19, 2013 18:47:12 Daniel Davidson wrote:
> Multi-part question:
>
> 1) Why does the last line fail? If cast to immutable how is it
> different than z? I know it is related to the ref. I'm using ref
> because I think it is likely more efficient - so assume the
> char[16] were really char[1024].
As Namespace pointed out, ref (including const ref) does not accept rvalues -
only lvalues.
> 2) If I got rid of the ref, how many copies of the data would be
> made? And without looking at assembly what is a good way to
> answer this question? I've tried to add this(this) to other Stuff
> type structures to print when they are being called, but that
> does not work because no logic can be in the default constructor.
That would depend on what functions are being called and could change if the
code is refactored. The compiler will do moves instead of copies whenever it
can, so the situation is far better than with C++ (particularly pre-C++11),
but how many copies will actually be needed depends on what the functions are
doing and how many functions get called. Writing a postblit constructor would
be the only way that I know to track it, though I'm not sure why the lack of
default construction would be a problem, unless you're trying to name all of
your objects and print out exactly how many each individual one is copied. But
if you want to do that, then create a constructor that you pass the name, and
don't use a default-initialized value.
> 3) Also, is storing immutable(STUFF) in a struct in the general
> case (as opposed to just this one) useful or silly?
As soon as you have a const or immutable member in a struct, you can't ever
assign anything to it, even if all of its other members are mutable (you could
assign the individual, mutable members but not the whole struct). That means
stuff like if the struct is ever default-initialized, you can't even give it
another value, which tends to mean that you can't use such a struct in places
like arrays.
All in all, I think that it's pretty much always a bad idea to have a struct
with const or immutable members. It's just begging for problems. Tail-const or
tail-immutable is fine, because the members themselves aren't const or
immutable (just what they refer to), but having them be directly const or
immutable is a bad idea IMHO.
- Jonathan M Davis
More information about the Digitalmars-d-learn
mailing list