[ECOS] structure alignment question
Jonathan Larmour
jifl@eCosCentric.com
Fri Feb 20 04:37:00 GMT 2004
Gary Thomas wrote:
> On Thu, 2004-02-05 at 22:45, mohanlal jangir wrote:
>
>>I have some questions regarding structure alignment. If I declare a
>>structure like
>>
>>struct structure {
>> unsigned short a;
>> unsigned char b;
>> unsigned char pad[1];
>>};
>>
>>and then same structure like
>>struct structure {
>> unsigned short a;
>> unsigned short b;
>>};
>>
>>Are both declaration free from alignment problem for any kind of access or
>>it's only later one?
If used as they've been declared they are free from alignment problems. If
you access one via a pointer to the other, e.g. for the first structure:
struct structure foo;
((unsigned short *)&foo.b) = 1;
then that is illegal according to the C language definition - it's called
pointer aliasing and there are rules that prevent it in all but a few
exceptions. GCC could and has been known to miscompile code because of
people doing things like the above.
Of course there's also the issue of endianness to consider.
Instead you should use a union if you want that type of feature, e.g.
struct structure {
unsigned short a;
union b {
unsigned short bshort;
unsigned char bchar[2];
};
};
although that still doesn't address the endianness issue.
>>Another question is, if I have a structure like
>>struct structure {
>> unsigned int a;
>> unsigned short b;
>> unsigned char c;
>>};
>>
>>struct structure temp;
>>unsigned int *p = &(temp.a);
>>unsigned short *q = &(temp.b);
>>unsigned char *r = &(temp.c);
>>
>>Do all pointers (p, q and r) need to be 4 byte boundary aligned or p at 4
>>byte boundary, q at 2 byte boundary and r at 1 byte boundary will do?
If you have defined temp as you have written, then you don't need to worry
about alignment - the compiler will make sure the structure and its members
are aligned correctly for you.
If however you did something like:
struct structure *ptemp;
ptemp=(struct structure *)0x87654321;
ptemp->a = 1;
then this wouldn't work as you've used a cast to explicitly misalign the
structure.
> The answers you seek are architecture (and even ABI) dependent. You
> should ask on the GCC list to get authoratative answers.
Not in this case as fortunately this type of thing is defined in the C
standard.
Jifl
--
eCosCentric http://www.eCosCentric.com/ The eCos and RedBoot experts
>>>>> Visit us in booth 2527 at the Embedded Systems Conference 2004 <<<<<
March 30 - April 1, San Francisco http://www.esconline.com/electronicaUSA/
--["No sense being pessimistic, it wouldn't work anyway"]-- Opinions==mine
--
Before posting, please read the FAQ: http://ecos.sourceware.org/fom/ecos
and search the list archive: http://ecos.sourceware.org/ml/ecos-discuss
More information about the Ecos-discuss
mailing list