|
Boost : |
From: Andres J. Tack (atack2_at_[hidden])
Date: 2007-03-17 04:02:06
Ion, these concrete examples you brought up are very compelling. I
think you should include them with the documentation. It is helpful
to me, at least, to have an example analysis in front of me, so I can
review my own situation by it.
-- Tack On Mar 16, 2007, at 4:54 PM, Ion Gaztañaga wrote: > Gennadiy Rozental wrote: >> "Ion Gaztañaga" <igaztanaga_at_[hidden]> wrote in message >> news:45FAD381.1090600_at_gmail.com... >>> Gennadiy Rozental wrote: >>>> IOW this library promotes unsafe programming right? >>> Don't be that hard ;-) Let's say that intrusive containers are >>> interesting for the following purposes: >>> >>> -> Embedded systems. >> >> It's too generic. So are you saying std::list is not usefull for >> Embedded >> systems? > > I've used std::list in embedded systems. I'm only saying that > intrusive > containers are more embedded friendly because they are more space > efficient than non-intrusive containers. An class whose sizeof is 12 > bytes to be inserted in two lists at the same time would be > implemented > using two std::list<Object*> + dynamic allocation, which means (in a > typical 32 system): > > 12 bytes + bookeeping memory from the heap for each object > 12 bytes per std::list node (two pointers to form the list plus thes > sizeof(Object*) + plus bookeeping memory from the heap > > This means that you have 36 bytes per object + 3*bookeeping memory > from > the heap. > > With an intrusive list your object needs 12 bytes + 16 bytes from the > hooks: 28 bytes + bookeeping from the heap. > > If bookepping is 8 bytes (a typical figure) you have 60 bytes vs. 36 > bytes in size. If you have a million objects, there is big difference. > > An intrusive container will always be more space efficient than the > non-intrusive approach, specially for small objects. I know that > you can > use memory pools to minimize the size overhead, but you will never > beat > the intrusive approach. > >>> -> High performance algorithms. >> >> How intrusive containers enhance performance? > > Intrusive containers save memory allocations. That's a big advantage. > For example: > > std::vector<MyObject> objects(NUM_OBJECTS); > > std::list<MyObject*> list; > > for(int i = 0; i < NUM_OBJECTS; ++i){ > list.push_back(objects[i]); > } > > needs NUM_OBJECTS + 1 calls to the heap. > > The same example with intrusive containers: > > std::vector<MyIntrusiveObject> objects(NUM_OBJECTS); > > boost::intrusive::ilist<MyIntrusiveObject> list > (objects.begin(), objects.end()); > > just need 1 call to the heap. That's a big difference. > > Apart from that, iterating std::list<Object*> needs two memory > accesses > to reach the object. ilist<Object> just needs one. You can insert an > object in several containers at the same time, without any dynamic > memory allocation. > >>> -> Low-level memory algorithms, node pools, and similar stuff. >>> -> To build more complex containers, avoiding memory allocations. >> >> What an alternative existing solutions and how your library >> compare with >> them? > > Insertions in some intrusive containers (like lists) have no-throw > guarantee. So inserting in an intrusive list can't never fail and > that's > an important feature when writing low-level algorithms. > std::list<Object*> can throw because the allocation can throw. > >>> I agree that Intrusive is not a high-level library comparing it >>> to other >>> Boost libraries, but I really think that it will be very useful >>> to build >>> other Boost libraries. I would say that Intrusive wants to >>> convert some >>> currently unsafe/low-level practices a bit more safer without losing >>> performance. >> >> How safer? How much it adds to handwritten 10 liner intrusive >> container? > > Write an intrusive red-black tree. I'm pretty sure you will need > more than 10 lines. > > I agree that I should add numbers to the library documentation. But I > think that the advantages of intrusive containers are well-known. For > example, operating system kernels use intrusive containers internally > (linux is an example) because they are more efficient than their > non-intrusive counterparts. Just like intrusive_ptr is more efficient > than shared_ptr, because avoids an extra allocation to allocate the > reference count and the reference count is stored inside the object > avoiding extra memory accesses and cache misses. > > Best, > > Ion > _______________________________________________ > Unsubscribe & other changes: http://lists.boost.org/mailman/ > listinfo.cgi/boost
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk