attribute aligned(4) ignored

Chris Lattner sabre@nondot.org
Tue Jul 26 04:58:00 GMT 2005


On Mon, 25 Jul 2005, Ian Lance Taylor wrote:
> Chris Lattner <sabre@nondot.org> 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/



More information about the Gcc-help mailing list