Search

Byte alignment in a struct

Byte alignment in a struct

#include <iostream.h>

#define ALIGN 8
#pragma pack(ALIGN)

/* Algorithm

Byte offset between currentType and nextType  = MIN( multiple of Byte
Alignment specified , multiple of size of nextType)
**/

int ALIGNOFFSET(int currRelativeAddess,int currrentTypeSize,int
nextTypeSize)
{

int nOffset = currrentTypeSize ;//this is size of the current
type.Offset will be minimum of this size.
currRelativeAddess += currrentTypeSize ; //cuurent address is
increased by size of current type.
if( nextTypeSize < ALIGN) // now alignment depens on the next type
and also alignment defined by #pragam pack(#)
{
// if the size of next type is less than byte alignment size
specified , then offset will be increased to the muliple of
// size of next type.
int nRemainder  = currRelativeAddess % nextTypeSize ;
if(nRemainder != 0)
{
nOffset += nextTypeSize - nRemainder ;//this will
align boundary to next multiple of nextTypeSize
}

}
else
{
// if the byte alignment size specified is less than size of
next type , then offset will be increased to the next muliple of
// size of byte alignment.
int nRemainder  = currRelativeAddess % ALIGN ;
if(nRemainder != 0)
{
nOffset += ALIGN - nRemainder ;//this will align the
boundary to next multiple of ALIGN
}
}
return nOffset ;
}


struct S
{

   char a[2];
   int b;
   double c;
   char d[1];
   int e;
   double f;
};

void main()
{
S sz;
cout << "size of struct :" << sizeof(sz) << endl;
cout << "address of size::a "<< &sz.a <<" Actual offset = " <<
int(0) << " Calculated offset = " << 0 << endl;

int offset = ((int)&sz.b)- (int)(&sz.a);


cout << "address of size::b " << &sz.b <<" Actual offset = " <<
offset << " Calculated offset = " << ALIGNOFFSET((int)(&sz.a)-
(int)(&sz),sizeof(sz.a),sizeof(sz.b)) << endl;
offset = ((int)&sz.c)- (int)(&sz.b);

cout << "address of size::c " << &sz.c <<" Actual offset = " <<
offset << " Calculated offset = " << ALIGNOFFSET((int)(&sz.b) -
(int)(&sz),sizeof(sz.b),sizeof(sz.c)) << endl;
offset = ((int)&sz.d)- (int)(&sz.c);

cout << "address of size::d " << &sz.d <<" Actual offset = " <<
offset << " Calculated offset = " << ALIGNOFFSET((int)(&sz.c)-
(int)(&sz),sizeof(sz.c),sizeof(sz.d)) << endl;

offset = ((int)&sz.e)- (int)(&sz.d);

cout << "address of size::e " << &sz.e <<" Actual offset = " <<
offset << " Calculated offset = " << ALIGNOFFSET((int)(&sz.d)-
(int)(&sz),sizeof(sz.d),sizeof(sz.e)) << endl;
offset = ((int)&sz.f)- (int)(&sz.e);
cout << "address of size::f " << &sz.f <<" Actual offset = " <<
offset << " Calculated offset = " << ALIGNOFFSET((int)(&sz.e)-
(int)(&sz),sizeof(sz.e),sizeof(sz.f)) << endl;
}

-------------------
-------------------