Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C Programming > Byte Alignment

Reply
Thread Tools

Byte Alignment

 
 
Shashi
Guest
Posts: n/a
 
      11-10-2003
Can somebody explain how the byte alignment for structures work,
taking the following example and considering:
byte of 1 Byte
word of 2 Bytes
dword of 4 Bytes

typedef struct
{
byte a;
word b;
dword c;
byte d;
}foo;

foo foo1;
x=sizeof(foo1);

What will be the value of x in different cases,
For One Byte Alignment
For Two Byte Alignment
For Four Byte Alignment
It will be nice if I get a good explaination too...Thanx
 
Reply With Quote
 
 
 
 
Joona I Palaste
Guest
Posts: n/a
 
      11-10-2003
Shashi <(E-Mail Removed)> scribbled the following:
> Can somebody explain how the byte alignment for structures work,
> taking the following example and considering:
> byte of 1 Byte
> word of 2 Bytes
> dword of 4 Bytes


> typedef struct
> {
> byte a;
> word b;
> dword c;
> byte d;
> }foo;


> foo foo1;
> x=sizeof(foo1);


> What will be the value of x in different cases,
> For One Byte Alignment
> For Two Byte Alignment
> For Four Byte Alignment
> It will be nice if I get a good explaination too...Thanx


It is entirely possible that x will be 1000 for each case. When
calculating the sizeof of a struct, the C implementation has to
take alignment issues into consideration. However, it isn't required
to use alignment issues as the *only* reason for the sizeof.

--
/-- Joona Palaste ((E-Mail Removed)) ------------- Finland --------\
\-- http://www.helsinki.fi/~palaste --------------------- rules! --------/
"The large yellow ships hung in the sky in exactly the same way that bricks
don't."
- Douglas Adams
 
Reply With Quote
 
 
 
 
Simon Biber
Guest
Posts: n/a
 
      11-10-2003
"Shashi" <(E-Mail Removed)> wrote:
> Can somebody explain how the byte alignment for structures work,


The insertion of padding bytes in structures is entirely up
to each compiler and there is no rhyme nor reason specified
by the C Standard. The only restriction is that there can
be no padding before the first member of the structure. There
can be any number of bytes skipped between each member and
after the last member.

> taking the following example and considering:
> byte of 1 Byte
> word of 2 Bytes
> dword of 4 Bytes


Good thing you specified that -- but remember that some
implementations do not have an integer type with exactly
2 bytes or exactly 4 bytes.

> typedef struct
> {
> byte a;
> word b;
> dword c;
> byte d;
> } foo;
>
> foo foo1;
> x=sizeof(foo1);
>
> What will be the value of x in different cases,


All you can tell is that it will be at least 8 -- it
could be any size greater than or equal to 8.

--
Simon.


 
Reply With Quote
 
Eric Sosman
Guest
Posts: n/a
 
      11-10-2003
Shashi wrote:
>
> Can somebody explain how the byte alignment for structures work,
> taking the following example and considering:
> byte of 1 Byte
> word of 2 Bytes
> dword of 4 Bytes
>
> typedef struct
> {
> byte a;
> word b;
> dword c;
> byte d;
> }foo;
>
> foo foo1;
> x=sizeof(foo1);
>
> What will be the value of x in different cases,
> For One Byte Alignment
> For Two Byte Alignment
> For Four Byte Alignment
> It will be nice if I get a good explaination too...Thanx


The Standard that defines the C language says little
about alignment. It notes that some implementations may
find it advantageous to align certain data objects to
certain address boundaries, and it permits implementations
to insert extra "padding bytes" after struct elements in
order to satisfy the alignment requirements. It can be
deduced that the alignment for some object is a divisor
of the object's size, but this is not explicitly stated.

"One byte alignment" presumably means that a data
object is properly aligned if its address is divisible by
one, or in other words a data object can begin at any
address. In this case there is no compelling reason for
the implementation to insert any padding in a `foo' struct,
and `sizeof(foo)' is probably 1+2+4+1 = 8 bytes.

"Two byte alignment" presumably means that a data
object is properly aligned if its address is divisible by
two, but that objects smaller than two bytes need no
alignment (because of the divisibility criterion). In
this case there will probably be padding after `a' so that
`b' and `c' can begin on even addresses, and more padding
after `d' so the entire struct takes an even number of
bytes (if its size were odd, you couldn't malloc() an
array containing two of them). So the total is probably
1+1+2+4+1+1 = 10 bytes.

You should now be able to work out the four-byte case,
and I'll leave you the pleasure of doing so (in case this
is homework). The interesting thing about this case is
that we know what alignment is required for `dword' and
for `byte', but "four byte alignment" doesn't tell us how
a `word' must be aligned. The two possibilities lead to
two different likely arrangements of padding bytes, and
you should try to find them both.

Note that I've been saying "likely" arrangements and
"probable" sizes, because the Standard grants quite a lot
of freedom to the implementations in this matter. For
example, an implementation is free to align a struct more
strictly than any of its constituent elements, if that
seems convenient to the implementors; the two-byte case
probably gives a size of 10 bytes, but might plausibly
yield 12 or 16 instead. The only way to be sure is to see
what the implementation actually does -- and to realize
that other implementations may do it differently.

--
http://www.velocityreviews.com/forums/(E-Mail Removed)
 
Reply With Quote
 
Thomas Matthews
Guest
Posts: n/a
 
      11-10-2003
Shashi wrote:
> Can somebody explain how the byte alignment for structures work,
> taking the following example and considering:
> byte of 1 Byte
> word of 2 Bytes
> dword of 4 Bytes
>
> typedef struct
> {
> byte a;
> word b;
> dword c;
> byte d;
> }foo;
>
> foo foo1;
> x=sizeof(foo1);
>
> What will be the value of x in different cases,
> For One Byte Alignment

Offset field
00 a
01 b
03 c
07 d
08


> For Two Byte Alignment

Offset field
00 a
01 {padding byte length 1}
02 b
04 c
08 d
09 {padding byte length 1}
10


> For Four Byte Alignment

Offset field
00 a
01 {padding bytes length 3}
04 b
06 {padding bytes length 2}
08 c
12 d
13 {padding bytes length 3}

> It will be nice if I get a good explaination too...Thanx

Many compilers will add extra bytes after a field to make
it align to the next boundary. This is what alignment is
with structures.

Some compilers supply a pragma for "packing" structures,
which means that no padding bytes are added. However, it
may not access the fields correctly.

Remember that the size of a structures may not be the
sum of the size of its fields.

--
Thomas Matthews

C++ newsgroup welcome message:
http://www.slack.net/~shiva/welcome.txt
C++ Faq: http://www.parashift.com/c++-faq-lite
C Faq: http://www.eskimo.com/~scs/c-faq/top.html
alt.comp.lang.learn.c-c++ faq:
http://www.raos.demon.uk/acllc-c++/faq.html
Other sites:
http://www.josuttis.com -- C++ STL Library book

 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Byte Alignment of Character to 2 byte v.venkatesh@gmail.com C Programming 1 07-06-2005 10:34 AM
Is it required to comply byte alignment within a function? gamja C Programming 14 05-15-2005 09:46 AM
byte alignment Marco C++ 4 01-22-2005 01:41 PM
JNI with 1 byte alignment crashes JVM Dave Rathnow Java 2 11-07-2003 08:14 AM
Byte alignment in union Ares Lagae C++ 21 09-01-2003 03:49 PM



Advertisments