Re: [boost] [Boost-announce] Review of Intrusive library begins today

In-Reply-To: <46001891.5080209@gmail.com> igaztanaga@gmail.com (=?ISO-8859-1?Q?Ion_Gazta=F1aga?=) wrote (abridged):
Sink sounds good but now I need a name for operations:
I would be tempted by: clear_and() erase_and() leaving open what the passed functor was expected to do. Alternatively: clear_and_dispose() erase_and_dispose() because for me "dispose" is a less committed word than "destroy". It still has the connotation that the container is getting rid of them, but leaves it more open as to what that entails. "Dispose" does have a more specific meaning in garbage collection circles; I don't know if that would be a problem here.
Could remove_and_destroy take a default Destroyer argument that deleted the value?
Well, functions can't have default template parameters
Ah, OK. (Sometimes these language restrictions take me by surprise.)
I understand that maybe replacing code using list<value*> is not an easy task, but I prefer to stick to the STL interface.
You would still do that, but instead of instantiating ilist<T> you would instantiate ilist<T*>. To me there is a fairly strong sense in which the list does not contain values, but only pointers to them, because of the lifetime issues. I see myself creating objects and then adding them to the collection, rather than adding copies of them, so the semantics are closer to std::list<T*> than to std::list<T>. Where there are differences they are restrictions (no NULLs, no putting items in multiple lists etc) rather than changes. The main drawback I see to my suggestion is that a signature like: void push_back( T * ); suggests that we can pass NULL, where-as your current signature makes it clear we can't (because it takes a T reference argument). And we would have the usual std inconvenience of having to use things like (*i)->member instead of i->member for iterators. I don't know; it's just something which surprised me. Do other people think ilist is closer to list<T> or list<T*>?
Well, comparing sizes of STL containers is a bit misleading, because how many bytes are we supposed to use in memory bookeeping if we use standard allocators?
I'd say none. For example, I believe the overhead for a std::slist<T*> node is 2 pointers, half that of ilist<T>. (And that is the comparison I would make, because I see ilist<T> as a replacement for std::list<T*> rather than for std::list<T>, but maybe I am unusual in that.) -- Dave Harris, Nottingham, UK.

Dave Harris wrote:
In-Reply-To: <46001891.5080209@gmail.com> igaztanaga@gmail.com (=?ISO-8859-1?Q?Ion_Gazta=F1aga?=) wrote (abridged):
Sink sounds good but now I need a name for operations:
I would be tempted by: clear_and() erase_and()
leaving open what the passed functor was expected to do. Alternatively: clear_and_dispose() erase_and_dispose()
because for me "dispose" is a less committed word than "destroy". It still has the connotation that the container is getting rid of them, but leaves it more open as to what that entails. "Dispose" does have a more specific meaning in garbage collection circles; I don't know if that would be a problem here.
Now I need a new for the function object (disposer? ;-))
I don't know; it's just something which surprised me. Do other people think ilist is closer to list<T> or list<T*>?
For the moment I think people like the current interface.
Well, comparing sizes of STL containers is a bit misleading, because how many bytes are we supposed to use in memory bookeeping if we use standard allocators?
I'd say none. For example, I believe the overhead for a std::slist<T*> node is 2 pointers, half that of ilist<T>.
I suppose you mean std::list (slist is not an standard container). In both cases you need to allocate T. For std::list T's size is A. For ilist T's size is A + 2 pointers. Now you need std::list<T*> with overhead of a node with 3 pointers (T*, a pointer to the next node and a pointer the previous node). This node is allocated dynamically, which typically has a memory allocation header (typical figure 8 bytes in 32 bytes, unless a pool is used). 2 pointers versus 3 pointers + allocation overhead. An intrusive containers will _always_ be more space efficient than a non-intrusive one. I'll try to explain this in the documentation.
-- Dave Harris, Nottingham, UK.
Regards, Ion
participants (2)
-
brangdon@cix.compulink.co.uk
-
Ion Gaztañaga