Thread overview
Does the spec preclude objects being movable by the GC?
Feb 25, 2013
Ben Davis
Feb 25, 2013
Ben Davis
Feb 25, 2013
Vladimir Panteleev
February 25, 2013
Unless I'm mistaken, this page:

http://dlang.org/garbage.html

states that it's safe to use a union to share storage with a pointer, e.g.

union U { void* ptr; int value }

But that wouldn't be safe if the GC ever moved objects. Should the page be tweaked? Especially as further down on that page, it says that a moving garbage collector can be implemented if one follows the rules.
February 25, 2013
On 25/02/2013 23:15, Ben Davis wrote:
> Unless I'm mistaken, this page:
>
> http://dlang.org/garbage.html
>
> states that it's safe to use a union to share storage with a pointer, e.g.
>
> union U { void* ptr; int value }
>
> But that wouldn't be safe if the GC ever moved objects. Should the page
> be tweaked? Especially as further down on that page, it says that a
> moving garbage collector can be implemented if one follows the rules.

Actually I suppose it's possible for any object affected by that union to be pinned. Is that the intention?
February 25, 2013
On Monday, 25 February 2013 at 23:17:16 UTC, Ben Davis wrote:
> On 25/02/2013 23:15, Ben Davis wrote:
>> Unless I'm mistaken, this page:
>>
>> http://dlang.org/garbage.html
>>
>> states that it's safe to use a union to share storage with a pointer, e.g.
>>
>> union U { void* ptr; int value }
>>
>> But that wouldn't be safe if the GC ever moved objects. Should the page
>> be tweaked? Especially as further down on that page, it says that a
>> moving garbage collector can be implemented if one follows the rules.
>
> Actually I suppose it's possible for any object affected by that union to be pinned. Is that the intention?

As I understand it, there will always be uncertain references, such as those found on the stack (esp. stack of C functions) and data segment. Such uncertain references will pin objects they point at, however ideally this would only apply to a small percentage of heap objects. A moving GC in D would only move those objects for which it can be certain that it knows how to safely update all existing references to the object.