Chuck Messenger wrote:
boost/libs/smart_ptr/src/sp_collector.cpp:
There is no sample program to compile/run, so I have to guess somewhat at how to use this one.
There is libs/smart_ptr/test/collector_test.cpp. You need to #define BOOST_SP_ENABLE_DEBUG_HOOKS.
OK - thanks. I'll give it a try...
The basic idea of the algorithm is to keep track of all heap objects managed by a shared_ptr. When the collector is invoked, it can use this information, coupled with a memory scan in these heap blocks, to compute the reference counts that would have occured if not for the external shared_ptr instances that are unknown to the collector.
Using the difference between the computed counts and the actual counts, the collector can infer which blocks are reachable (they have a larger real count).
Got it - clever! Thanks for the explanation.
Greg's cyclic_ptr uses the same algorithm except that his code decrements the counts in place instead of maintaining a parallel count structure. It also uses x = x; assignments (a clever trick) to discover the pointer members.
Both pointer discovery methods are flawed, although in different ways. :-) It is not possible to write a portable collector using this algorithm without compiler support.
Another class of garbage collected smart pointers keeps track of every smart pointer _instance_ using a global registry (sp_collector.cpp keeps track of every _object_). The upside is perfect discovery. The downside is that every smart pointer copy incurs much larger overhead, esp. in multithreaded code where the central registry becomes a bottleneck.
Sure, it won't be useful in a context where you're really stressing the system with garbage. But it has some nice advantages.
What is the status of sp_collector.cpp? It's distributed as part of Boost right now. Is it intended to remain part of the shared_ptr library? It sounds like it should suit my purposes quite well, after all...
- Chuck
_______________________________________________ Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost