Container hierarchy vs. container types
Jonathan M Davis
jmdavisProg at gmail.com
Fri Mar 5 12:33:15 PST 2010
Andrei Alexandrescu wrote:
> (b) Pass by reference is more natural for containers than pass by value.
I concur with this. It rarely makes sense to outright copy containers, and
when you do, you're explicitly looking to do so. If a container were a
struct, then returning it from a function would be expensive. And it could
get really messy trying to have one container as an element in another -
particularly if you can't get a reference to the element in the container.
You'd have to copy it out of the container, modify it, and copy it back in
again. That's way too much unnecessary copying. And it would be easy to
think that after you'd changed the element after getting it out of the
container that it had changed the one in the container when you hadn't.
Container!(Container!(E)) cont;
...
auto element = cont.get(x);
element.add(someValue);
//With a class, the element in the container would now be altered.
vs
Container!(Container!(E)) cont;
...
auto element = cont.get(x); //this involves a copy
element.add(someValue);
cont.set(x, element); //this involves a copy
Now, by getting at the elements of a container by reference, that reduces
the problem, but generally speaking, it makes no sense to be copying
containers, and it's expensive to do so. I'd vote to just make them final
classes. You gain the efficiency of inlining and have reference semantics
which is really what typically makes sense for containers. If you want it
copied, you can clone it or construct a new one with the elements of the
first one. I really don't see what would be gained by making a container a
struct.
- Jonathan M Davis
More information about the Digitalmars-d
mailing list