On Thu, Apr 16, 2009 at 12:34 PM, Don <[email protected]> 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. >
