Initial commit
This commit is contained in:
@@ -0,0 +1,96 @@
|
||||
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;
|
||||
}
|
||||
Reference in New Issue
Block a user