On Monday, 15 June 2015 at 12:49:25 UTC, 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?

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 *...

-Steve

I think you miread it.

The memory the pointer points to can be misaligned.
The memory the pointer is in must be aligned.

Note that the second is mandatory is various hardware architecture to begin with, so it is not like it is a big constraint. It allow the GC to scan faster. It is all good.

The first one do not make any sense as GC need to support interior pointers anyway.

Reply via email to