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