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).
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.