On 8/5/05, Amit Dang <[EMAIL PROTECTED]> wrote:
> Hi Vadiraj,
> The statement " Take it for granted you get either 4 byte or 8 byte boundary
> but never 1 byte." you made is it generic or just valid for the structure in
> question? If its generic then I have a question.
> Why the size of
> struct {
> char i;
> char j;
> char k;
> } is 3 ? (gcc 2.96 on Linux 32-bit machine).
Because the alignment requirement for this structure is 1, it is
byte-aligned. A structure is padded and properly aligned only if one
of its members requires more than a single byte of storage. Take a
look at this:
struct a {
char a;
int :0;
char b;
};
its size is 3, since it's byte-aligned also. This rule does not hold
for the structure
struct b {
char a;
short s;
}
since one member, here s, requires more than one byte of storage and
must be aligned to a 4 byte boundary (4 is the smallest possible
multiple of 2 larger than 3) resulting in sizeof(b) == 4.
> What I have understood atleast for gcc compiler Linux 32-bit machine is
> that, Maximum byte boundary is 4.
True for int, but double and long long will always be 8 byte aligned by default.
> equal to minimum of (4 or field with maximum size (within the structure)).
> i.e. for the above example maximum field size if 1 and min (4, 1) = 1, so
> structure is aligned to 1 byte.
> If I have following structure
> struct {
> short i;
> char j;
> } its size will be 4.
True.
> if i modify the above struct to
> struct {
> int i;
> char j;
> } its size will be 8.
Yes, exactly.
> Now modifying int to long long in the above structure will have a size of
> 12 not 16 because byte alignment min (4, 8) = 4.
No, it will have a size of 16 because the alignment requirement for
this structure is a multiple of its largest member. long long and
double is always double word aligned.
Regards
\Steve
-
To unsubscribe from this list: send the line "unsubscribe linux-c-programming"
in
the body of a message to [EMAIL PROTECTED]
More majordomo info at http://vger.kernel.org/majordomo-info.html