On Friday, 5 July 2024 at 19:56:49 UTC, Tim wrote:
>On Friday, 5 July 2024 at 19:35:10 UTC, Steven Schveighoffer wrote:
>What if you need > 32 bits or want to pack into a ulong
? Is the behavior sane across compilers?
The following struct has a different layout for different platforms:
...
Thanks for this.
I also tested the following, and found it too shows discrepancies.
struct S {
unsigned short x;
unsigned int a : 12;
unsigned int b : 12;
unsigned int c : 8;
};
Here there are only uint
bitfields, yet the compiler chooses to layout the bits differently based on the preceding field.
Walter, I have to unfortunately withdraw my support for defining D bitfields to just be the same as C bitfields -- the minefields are too subtle. The statement that "If you use uint as the field type, you'll get the same layout across every C compiler" is not true. And I don't think we can really specify the true nature of what you must do for portable bitfields in a way that is straightforward. Saying something like "you can only use uint
bitfields in structs that contain only uint
types" is not a good feature.
I'm back to requesting that we have a mechanism to request C bitfields (such as marking a struct as extern(C)
), or picking one C style and going with that.
-Steve