Alignment of unions
Tomas Lindquist Olsen
tomas.l.olsen at gmail.com
Thu Apr 16 03:48:57 PDT 2009
On Thu, Apr 16, 2009 at 12:34 PM, Don <nospam at nospam.com> wrote:
> Stewart Gordon wrote:
>>
>> Don wrote:
>>>
>>> Stewart Gordon wrote:
>>>>
>>>> Don wrote:
>>
>> <snip>
>>>>>
>>>>> I'm not sure why you think unions are so different to structs. They are
>>>>> identical in most respects -- including requirements for alignment of
>>>>> members.
>>>>
>>>> I still don't know what you mean.
>>>
>>> You're acting as if there's a big difference between unions and structs,
>>> and there isn't. Read the spec, the only differences are at construction,
>>> and struct literals.
>>
>> No, you have to add to that the differences inherited from C. Moreover,
>> what difference could possibly be bigger than that between the basic
>> essence of structs and the basic essence of unions?
>
> In the compiler, struct and union share almost all of their code.
> Basically, a union is just a struct where all the elements are on top of
> each other. Which is a tiny difference compared (say) to the difference
> between structs and classes. For example, this works:
>
> union foo(T) {
> public:
> static int bar(int x) { return x*2; }
> }
>
> void main()
> {
> assert (foo!(int).bar(7)==14);
> }
>
>
>>
>> http://www.digitalmars.com/d/1.0/struct.html
>> "They work like they do in C, with the following exceptions:"
>>
>> It's true that "alignment can be explicitly specified" is in there. But
>> I'm not sure that Walter really meant it to apply to unions as well as
>> structs. Especially given that it makes no comment (that I've found) on
>> what align is meant to do in a union.
>
> In a struct, align(4) int X; means, pad with zero bytes until the address
> you're up to is a multiple of 4, then put the int at that address. The
> address for the next element is the first byte past the int.
> In a union, align(4) int X; means, pad with zero bytes until the address
> you're up to is a multiple of 4, then put the int at that address. The
> address for the next element is the first byte of the union.
>
> Moreover,
>>
>> http://www.digitalmars.com/d/1.0/attribute.html#align
>> "Specifies the alignment of struct members."
>>
>>>>>> If you want a union to have a certain alignment relative to a struct
>>>>>> in which it's contained, in what cases is it not sufficient to put the align
>>>>>> attribute on the union's instance in the struct?
>>>>>
>>>>> In cases where you don't know what the containing struct is. The union
>>>>> may just be a type returned from a template, for example.
>>>>
>>>> If you don't know what the containing struct is, you probably also don't
>>>> know what member alignment that struct requires.
>>>
>>> Yes you do. The union doesn't control the alignment of the surrounding
>>> struct. It only controls the alignment of itself inside that struct.
>>
>> I thought that was meant to be controlled by an align applied to the union
>> instance as a member of the struct, rather than by an align applied to the
>> union itself. Only in the case of anonymous unions are they one and the
>> same.
>>
>>>> The person who creates the struct, OTOH, does know.
>>>
>>> They do NOT know. Not without probing every member in the union.
>>
>> ?? ISTM all they really need to know is the overall size of the union,
>> which is equal to the size of the union's largest member (which is easy to
>> find out).
>>
>>> So why are you trying to do that person's
>>>>
>>>> job?
>>>
>>> No, you know what alignment the member requires.
>>
>> <snip>
>>
>> What are the cases in which a member _requires_ a certain alignment?
>
> Static arrays, eg float[4]. Must be aligned if you want to use the movaps
> instruction (which is 4X faster than the unaligned instruction).
So now we just need align(N) for the storage as well as field offsets,
to actually make that useful.
>
> Alignment requirements are rare, even for structs.
>
>>
>> OK, so there's one case: pointers in order to make sure the GC works
>> properly. But this is absolute alignment. Maybe it's just me, but given
>> that talk of alignment is nearly always in relation to structs, I'd made it
>> out to be talking about relative alignment. Maybe the spec just needs to be
>> clearer....
>>
>> Stewart.
>
> Probably. Unions tend to get forgotten.
>
More information about the Digitalmars-d
mailing list