On Sunday, 14 June 2015 at 11:36:59 UTC, Paulo Pinto wrote:
On Sunday, 14 June 2015 at 11:03:00 UTC, Marc Schütz wrote:
On Saturday, 13 June 2015 at 22:07:26 UTC, deadalnix wrote:
On Saturday, 13 June 2015 at 11:32:20 UTC, 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?
That seems like an arbitrary limitation. This will create an
interior pointer, which the GC needs to recognize anyway.
The doc need to be updated.
I see David Nadlinger already said so in the PR, but that's
how I understand it:
AFAIU the purpose of this restriction is to allow the GC to
take advantage of alignment: a pointer with the lowest bit set
cannot point to a 4-byte aligned struct, for example. The GC
doc [1] mentions alignment several times, among them:
"Do not misalign pointers if those pointers may point into the
GC heap"
As for arbitrary pointer arithmetic being allowed, I guess
that's because the language doesn't distinguish between GC and
non-GC pointers. And note that it is un-@safe anyway.
[1] http://dlang.org/garbage.html
Wouldn't it make sense to do so?
Active Oberon, Modula-3 and .NET make such difference in their
pointer types.
I would imagine it could help in terms of what is possible for
GC improvements.
--
Paulo
But a pointer can already point to a one byte aligned part of an
object and keep it alive because internal pointers must be
supported. The only alignment enforced is that pointers must be
aligned. This is an arbitrary restriction.