Neat project: add pointer capability to std.bitmanip.bitfields

Vladimir Panteleev via Digitalmars-d digitalmars-d at puremagic.com
Fri Dec 4 02:31:19 PST 2015


On Friday, 4 December 2015 at 01:35:45 UTC, deadalnix wrote:
> First it check for alignement. Considering this :
>
> On Thursday, 3 December 2015 at 09:11:12 UTC, Vladimir 
> Panteleev wrote:
>> True, assuming that:
>>
>> 1. The pointers are still aligned at machine word boundaries
>
> No. The pointer needs to be aligned as per underlying data type 
> expectation. If it isn't aligned, the operation that produced 
> this unaligned pointer must be unsafe, not the bitfield 
> capability.

You misunderstood. The bitfield must *store* the pointers at 
addresses that are aligned at machine word boundaries.

>> 3. The setters enforce that the discarded pointer bits were 
>> zero
>
> If these bits aren't 0, the operation that set them to 1 is the 
> one that is unsafe.

Well, that depends on how many bits are discarded? And that's not 
log2(T.sizeof). `cast(size_t)ptr % T.sizeof` may not be 0 in all 
cases.

>> 4. No more than 4 bits are reused (as the smallest GC object 
>> size is 16 bytes)
>
> Not correct. Considering the pointer is of type T*, then it is 
> safe as long as align(T*) <= sizeof(T) which is correct on all 
> architectures I know of (tho I wouldn't be surprised that some 
> weird arch not used since the 70s may break this constraint).

I realized this was off after posting but I don't understand your 
reasoning either. The size and alignment just put a bound on the 
number of bits, but without verification in the setter you can't 
be sure, right?



More information about the Digitalmars-d mailing list