Kinds of containers

Jonathan M Davis via Digitalmars-d digitalmars-d at puremagic.com
Wed Oct 21 11:05:05 PDT 2015


On Wednesday, 21 October 2015 at 16:36:46 UTC, Brad Anderson 
wrote:
> On Wednesday, 21 October 2015 at 11:05:12 UTC, Andrei 
> Alexandrescu wrote:
> [snip]
>> 2. Reference containers.
>>
>> These have classic reference semantics (à la Java). 
>> Internally, they may be implemented either as class objects or 
>> as reference counted structs.
>>
>> They're by default mutable. Qualifiers should apply to them 
>> gracefully.
>>
>> 3. Eager value containers.
>>
>> These are STL-style. Somewhat surprisingly I think these are 
>> the worst of the pack; they expensively duplicate at the drop 
>> of a hat and need to be carefully passed around by reference 
>> lest performance silently drops. Nevertheless, when used as 
>> members inside other data structures value semantics might be 
>> the appropriate choice. Also, thinking of them as values often 
>> makes code simpler.
>>
>> By default eager value containers are mutable. They should 
>> support immutable and const meaningfully.
>
> Having both reference and value semantics for containers would 
> be great. I don't understand why reference semantics would be 
> implemented by the container themselves though. Why not a 
> general purpose RC! (or RefCounted! if the current design is 
> deemed sufficient) that can apply to anything, including 
> containers? Then you'd only need to implement the value 
> semantic containers (and maybe throw in some RC version aliases 
> to promote the use of the RC versions so the option isn't 
> overlooked). It seems kind of crazy that anything in D that 
> wants to be reference counted would need to implement the logic 
> themselves.
>
> If there are performance advantages (I haven't thought of any 
> but perhaps there are) to bake the RC right into the container 
> it might also be possible to use DbI take advantage of it in 
> RC! when appropriate.
>
> It just seems so wrong to implement reference counting dozens 
> of times independently, especially when that means implementing 
> all the containers twice too.

If we had value type containers and reference type containers, I 
would assume that they would at least share implementation, and 
maybe the reference types would just be wrappers around the value 
types. However, I completely fail to understand why you'd ever 
want a container that was a value type. In my experience, it's 
very error-prone and adds no value. It just makes it too easy to 
accidentally copy a container, and it can be pretty easy to have 
an iterator, range, etc. referring to a container that's already 
been destroyed (similar to having a dynamic array referring to a 
static array that's left scope). As long as the containers have a 
dup method (or whatever we call it) so that they can be copied 
when you do want to copy them, I would think that that was more 
than enough. What do you get with a value type container that you 
consider better than a reference type? It's not like it lives on 
the stack as a value type. Most of the container's guts are on 
the heap regardless.

- Jonathan M Davis


More information about the Digitalmars-d mailing list