On Fri, 28 Jan 2011 18:32:28 -0500, Michel Fortin <[email protected]> wrote:

On 2011-01-28 17:09:08 -0500, Andrei Alexandrescu <[email protected]> said:

On 1/28/11 3:05 PM, Michel Fortin wrote:
Not my preferred choices (especially #1), but having containers in
Phobos will certainly be an improvement over not having them. So go ahead!
Well if you brought forth some strong argument I'm all ears. What I see for now is that struct containers are just difficult to implement and need to have carefully explained semantics, whereas a lot of people know how classes behave from day one.

We already argument this over and over in the past. First, I totally acknowledge that C++ style containers have a problem: they make it easier to copy the content than pass it by reference. On the other side of the spectrum, I think that class semantics makes it too easy to have null dereferences, it's easy to get lost when you have a container of containers.

I have some experience with containers having class-style semantics: in Objective-C, I ended up creating a set of macro-like functions which I use to initialize containers whenever I use them in case they are null. And I had to do more of these utility functions to handle a particular data structure of mine which is a dictionary of arrays of objects. In C++, I'd have declared this as a "map< string, vector< Object > >" and be done with it; no need for special care initializing each vector, so much easier than in Objective-C.

I see value in this idiom, and I have ideas on how to solve this with class-based containers. Essentially, I think we need a way to construct a "container of containers" where the owner container is the one who has class semantics, and the sub-containers only provide access through the owner. I haven't fleshed out how this will work, but it solves another really important problem that dcollections currently has -- over-allocation.

The issue is, if you have a nested container (say a map of strings to linked-lists), the map container pre-allocates a page of elements, to ease stress on the GC. But so does each linked list! However, since the lists all are part of the map, they could potentially share the same allocator. If you have few elements in each list, this could significantly reduce the over-allocation of memory.

-Steve

Reply via email to