second draft: add Bitfields to D

Timon Gehr timon.gehr at gmx.ch
Sat May 4 17:05:52 UTC 2024


On 5/4/24 04:07, Walter Bright wrote:
>>>
>> No, this is not correct. It implements it as a field with accessors 
>> for different groups of bits. The only reason why `union` appears in 
>> that file is to support bitfields inside a union. This again 
>> highlights that those are not the same thing.
> 
> They are the same thing, it is not substantive what label is painted on 
> it. Anonymous unions can lay fields on top of each other without 
> explicitly labeling it as a union.

This is explicitly called a `union`, so I really do not see what you are 
trying to say.

Bitfields do not imply union, but they can be in a union, e.g.:

```C++
#include <bits/stdc++.h>
using namespace std;

struct S{
     union{
         struct {
             unsigned int x:1;
             unsigned int y:1;
         };
         unsigned int z:2;
     };
};

int main(){
     S s;
     s.z=3;
     cout<<s.x<<" "<<s.y<<endl; // 1 1
     s.x=0;
     cout<<s.y<<" "<<s.z<<endl; // 1 2
     s.y=0;
     s.x=1;
     cout<<s.z<<endl; // 1
}
```

Clearly bitfields are a new and distinct way fields can share the same 
`.offsetof` in D. Before bitfields, such fields would overlap given they 
both were of a type with a positive size. With bitfields there is no 
such overlap.

BTW: what about `sizeof`? I think in C++ this is disallowed on a bitfield.


More information about the dip.development mailing list