On Friday, May 30, 2003, at 12:38 America/Denver, Chuck Messenger wrote:


Gregory Colvin wrote:
Thanks, but your description of cyclic_ptr is pretty far off the mark.

Sorry -- hopefully you'll forgive my ignorance. I'm just throwing out what I understand to be the case, in the hopes that someone (such as yourself) would set me straight...


It does not maintain a global map, and copying cyclic_ptr cost the same
as copying shared_ptr.

OK, I'll have to review the old messages again. I thought someone had said cyclic_ptr used a global map. Sorry. I suppose better yet would be for me to study your actual *code*...

Larry's analysis gives a better explanation than I could.


Do you do a raw scan of memory, like sp_collector, then? (i.e. not perfect discovery)

No. The self-assignment trick is precise, unless it is foiled by a user-written operator=.

The special assignment mode is used only during
the mark phase of a collection, and costs more or less the same as any
other discovery method.

Suppose I have the structure:


    struct Image {
        char huge_image[ONE_ZILLION];
        cyclic_ptr<whatever> ptr;
    };

As I understand it, in order to discover 'ptr', you'd invoke operator=() on each Image structure you came to. Correct, or incorrect?

Correct. So it would be smart to write an operator= for Image that avoids copying huge_image to itself. And it would best if the uber-pointer used a less intrusive discovery method. I think sp_collector is on the right track, if it could be made precise.

_______________________________________________
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost

Reply via email to