On 6/15/15 11:18 AM, Dmitry Olshansky wrote:
On 15-Jun-2015 15:49, Steven Schveighoffer wrote:
On 6/15/15 8:08 AM, Dmitry Olshansky wrote:
On 13-Jun-2015 14:32, rsw0x wrote:
http://dlang.org/garbage.html

Do not take advantage of alignment of pointers to store bit flags in
the
low order bits:
p = cast(void*)(cast(int)p | 1);  // error: undefined behavior

if this restriction is actually imposed - why does
std.bitmanip.tagged{ClassRef,Pointer} even exist?

AFAIK the restriction was that pointers _themselves_ have to be stored
at word-aligned addresses. This allows GC to scan memory cheaper w/o
considering if some misaligned address may contain a pointer.

That doesn't make sense. Why would you want to do this?


What exactly? Storing pointer at misaligned memory location - no good
reason whatsoever. As in how it may happen - explicitly tightly packed
structs with align(1) might end up doing this.

 From http://dlang.org/phobos/core_memory.html which seems to be more
recent:

Implementations are free to assume that GC pointers are only stored on
word boundaries. Unaligned pointers may be ignored entirely.

Right, and that's already assumed in (and would be ignored by) the current GC. What's NOT assumed (and I have no idea how we could make this assumption) is that interior pointers that point at parts of a larger struct/type/etc aren't valid GC pointers, and so the GC can ignore those too.

For example:

void *p = &someGCInt;
p++; // equivalent to p = cast(void *)(cast(size_t)p | 1);

The documentation above implies that if p is the only pointer to someGCInt, the GC may collect it. I think this is not possible for us to claim, even if we wanted to, given D's type system.

The only rational thing I can think of is that you wouldn't want to
store the result in an *actual* int pointer (lest it be used thinking it
was valid without masking out the lower bits). But the example is
storing it in a void *...


The example doesn't show what memory location that p refers to thus it's
not possible to say if it's valid.

The whole premise (as stated in the doc right before the example) is that you know the low order bits are 0 :) this is the complete basis of std.bitmanip.taggedPtr. It's quite genius I think, and the fact that it works with GC (and IMO, any possible GC you could create for D) without issue is awesome. We should not be attaching a scarlet comment to the docs to warn people away from it.

-Steve

Reply via email to