On Mon, 25 Jul 2005, Ian Lance Taylor wrote:
Chris Lattner <sabre@xxxxxxxxxx> writes:
Hi All, I'm trying to reduce the alignment of the double in this
structure to 4 bytes (from 8) on Darwin. The goal of doing this is to
reduce the structure to 12 bytes in size. Here is my testcase:
struct Test {
double D __attribute__((aligned(4))); // only 4 bytes, not 8!
int X;
};
int X() {
return sizeof(struct Test); // Should return 12, not 16.
}
Despite my attempt above, the structure is still 16 bytes in size, due
to the tail padding required to pad the structure to ensure 8-byte
alignment.
Does anyone know how to reduce the alignment of the double,
eliminating the tail padding?
How about
double D __attribute__((aligned(4), packed));
This is exactly the sort of thing I want to do. My structs can be
arbitrarily complex, and can have a bunch of stuff in them that should not
be packed. This means that I don't want to use attribute packed on the
structure itself, but using it on the member would be fine.
However, when I try this:
struct Test {
double D __attribute__((packed,aligned(4)));
short X;
};
... the struct maintains its 8-byte alignment even though nothing inside
of it requires 8-byte alignment any more. In this particular case, for
example, I want the struct to be 12-bytes, not 10: just reducing the
alignment requirement of the double, without eliminating all intra-struct
padding. This is why I don't think I can use attribute packed on the
struct itself.
Unfortunately, I'm not sure if this is possible, at least without using
'packed' on the struct, then inserting a bunch of dummy members to
explicitly insert the intra-field packing. I hope there is a better way
though, as this is really nasty and fragile.
Thanks,
-Chris
--
http://nondot.org/sabre/
http://llvm.org/