You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
This is a sister issue to #3133. Packed structs offer a way to explicitly provide the layout of a struct in memory. But non-packed structs also can offer something powerful: the ability to say that you do not need a field to be aligned to a byte boundary.
Because structs do not guarantee field order, Zig is allowed to put a, c, d, and e fields into 1 byte, making the entire struct only 2 bytes, rather than 5.
The compromise here is that pointers to align(0) fields have pointer metadata in the type that prevents it from being coerced to a "normal" pointer for that type. This the same thing as taking a pointer of a non-byte-aligned packed struct field.
However this would be quite useful for flags, where one typically does not need a pointer to an individual flag. Rather, one typically accesses flags from a base pointer, which would work just fine with align(0) flag fields.
Is there a reason why someone wouldn't first reach for embedding a packed struct inside a normal struct for bitflags before trying this? I do see the general appeal of making align(0) well defined, an in the manner you've described, but specifically for flags, there are already, seemingly simpler, more controlled ways of accomplishing the task. Overall, I think that when operating at the bit level, one's mind is probably wanting data laid out carefully rather than letting the compiler take the wheel.
Activity
JesseRMeyer commentedon Nov 29, 2019
Is there a reason why someone wouldn't first reach for embedding a packed struct inside a normal struct for bitflags before trying this? I do see the general appeal of making align(0) well defined, an in the manner you've described, but specifically for flags, there are already, seemingly simpler, more controlled ways of accomplishing the task. Overall, I think that when operating at the bit level, one's mind is probably wanting data laid out carefully rather than letting the compiler take the wheel.
andrewrk commentedon Nov 29, 2019
A packed struct has a well-defined in-memory layout. If you do not need this, then it is better to avoid it, for plenty of reasons:
@ptrCastand other related functions is possible (not implemented yet) when the type has no well-defined in-memory layoutundefinedvalues is possible (not implemented yet) when the type has no well-defined in-memory layoutHowever if you need well-defined in-memory layout, that's fine, that's what packed structs are for.
daurnimator commentedon Dec 22, 2019
Shouldn't
align(0)work on types in the general case? e.g.[1024] align(0) boolfor a packed array of booleansandrewrk commentedon Jan 14, 2022
Rejected in favor of #5049 and #10113.