On 8/2/05, Amit Dang <[EMAIL PROTECTED]> wrote:
> Thanks Steve. So what is the best way of laying down a structure definition
> to over come cross platform issues?
> I read about introducing some explicit padding in the structure to take care
> for cross platform issues but for that I suppose one should have information
> about byte alignment & structure padding on all targeted platforms. Is that
> true or there is some generic way of doing that? (Apart from using compiler
> option to remove any padding )
>
The easiest way to write 64-bit clean application that are targeted
for both 64-bit and 32-bit machines, is to consider the following
points:
- lint helps to detect ambigious code and portability problems
- use portable headers like <inttypes.h>
- always compile in ANSI C/C++
- perform boundary checking on integral type ranges
- update all code where 32-bit and 64-bit processes share a memory
segment
inttypes.h defines several types suitable for both 64-bit and 32-bit
programs. For example, use off_t and other integral types where
applicable and (u)int32_t or (u)int64_t instead of int or long. The
same applies to pointers; always use intptr_t or uintptr_t instead of
(int *) and (unsigned *). Use 64-bit data types only if required.
There are hundreds of hints out there that are more or less
insightful. An interesting artical on this issue can be found at
http://gcc.fyxm.net/summit/2003/Porting%20to%2064%20bit.pdf. It
addresses the most important facts and names pitfalls when it comes to
writing portable code.
Hope this helps (a bit at least).
\Steve
> ----- Original Message -----
> From: "Steve Graegert" <[EMAIL PROTECTED]>
> To: "Amit Dang" <[EMAIL PROTECTED]>
> Cc: <[email protected]>
> Sent: Tuesday, August 02, 2005 12:12 PM
> Subject: Re: Any pointer to Byte Alignment & Structure Padding?
>
>
> > On 8/2/05, Amit Dang <[EMAIL PROTECTED]> wrote:
> > > Do you mean that max byte alignment on a 32-bit machine is 4 bytes? If
> we
> > > move to 64-bit machine will the size of this structure be 24 bytes?
> >
> > 32-bit machines' maximum alignment is 4 bytes and 64-bit machines
> > align up to 8 bytes. This does not mean that all integral types are
> > padded to 8-byte boundaries. Yes, the size of the structure will
> > change to 24 bytes, because the most efficient offset for the long
> > member is at byte 16 and not byte 12. It is very likely that a
> > padding of 4 bytes will be inserted after the 3rd structure member.
> > As a result the size of the structure will increase to 24 bytes.
> >
> > On IA64 long and long long, both signed and unsigned, are 8-byte
> > aligned, while int is 4-byte, short 2-byte and char 1-byte aligned.
> > Nevertheless, padding is needed for short and char to align to 4-byte
> > boundaries. Therefore the size of the structure would not change,
> > since the member of type long is 4-byte aligned already, but
> > unfortunately its layout in memory is very inefficient. The
> > increasing size of the structure in this particular case is not a
> > result of the alignment itself but of the compiler's efforts to
> > optimize memory layout.
> >
> > Normally a structure is also padded at the end in order to make the
> > size a multiple of the alignment if needed. Rules for alignment are
> > compiler and platform specific.
> >
> > Regards
> >
> > \Steve
> >
> >
> > > ----- Original Message -----
> > > From: "wwp" <[EMAIL PROTECTED]>
> > > To: <[email protected]>
> > > Sent: Monday, August 01, 2005 7:41 PM
> > > Subject: Re: Any pointer to Byte Alignment & Structure Padding?
> > >
> > >
> > > > Hello Amit,
> > > >
> > > >
> > > > On Mon, 1 Aug 2005 17:57:48 +0530 "Amit Dang"
> > > > <[EMAIL PROTECTED]> wrote:
> > > >
> > > > > Hi Vadiraj,
> > > > > Thanks for the explaination but when i try following structure
> > > > > struct temp
> > > > > {
> > > > > char c; /* 1 byte lenght */
> > > > > int i; /* 4 byte length */
> > > > > char c1; /* 1 byte length */
> > > > > long long d /* 8 bytes lenght */
> > > > > };
> > > > > on a linux machine x86 32-bit with gcc 2.96. It gives its size = 20
> > > bytes
> > > > > not 24 bytes (as explained by you)
> > > >
> > > > See below (this applies to both members sorting examples from
> Vadiraj):
> > > >
> > > > struct padded offset
> > > > member size size range
> > > > -------------------------------
> > > > c 1 4 0-3
> > > > i 4 4 4-7
> > > > c1 1 4 8-11
> > > > d 8 8 12-19
> > > >
> > > > So, 20 bytes. Isn't it right?
> > > >
> > > >
> > > > Regards,
> > > >
> > > > > ----- Original Message -----
> > > > > From: "Vadiraj" <[EMAIL PROTECTED]>
> > > > > To: "Amit Dang" <[EMAIL PROTECTED]>
> > > > > Sent: Monday, August 01, 2005 5:44 PM
> > > > > Subject: Re: Any pointer to Byte Alignment & Structure Padding?
> > > > >
> > > > >
> > > > > > On 8/1/05, Amit Dang <[EMAIL PROTECTED]>
> wrote:
> > > > > > > Hi,
> > > > > > > Can any body provide some light on Byte Alignment & Structure
> > > Padding
> > > > > > > for gcc linux x86 32-bit?
> > > > > >
> > > > > > The system expects the address of a variable to be multiple of
> > > > > > its size. Meaning for 32 bit x86 int being 4 bytes. The address
> > > > > > location of a int variable is expected to be at multiple of 4.
> > > > > > ex 0 4 8 12 16. if its double then its expected it to be multiple
> of
> > > 8.
> > > > > > 0 8 16 ...
> > > > > >
> > > > > > In case of structure allignment... this is achieved by padding.
> > > > > > if this is the structure
> > > > > > struct temp
> > > > > > {
> > > > > > char c; /* 1 byte lenght */
> > > > > > int i; /* 4 byte length */
> > > > > > char c1; /* 1 byte length */
> > > > > > long long d /* 8 bytes lenght */
> > > > > > };
> > > > > >
> > > > > > c starts at offset x( x is assured 4 byte alligned by gcc), i
> should
> > > > > > start at x+4 as it has to be multiple of 4 3 bytes of padding will
> be
> > > > > > done by gcc.
> > > > > > c1 starts at x+9, no padding is required char is 1 byte.
> > > > > > d starts at x+16,7 bytes of padding to get multiple of 8.
> > > > > >
> > > > > > It would differ if you re arrange the struct like this.
> > > > > > struct temp
> > > > > > {
> > > > > > char c; /* 1 byte lenght */
> > > > > > int i; /* 4 byte length */
> > > > > > long long d /* 8 bytes lenght */
> > > > > > char c1;
> > > > > > };
> > > > > >
> > > > > > for same base offset...i will be from x+4 d would start from x+8,
> > > > > > there would be no padding for d and c1 at x+16.
> > > > > >
> > > > > > I hope it helps.
> > > > > > --
> > > > > > cheers,
> > > > > > Vadi
> > > > >
> > > > > -
> > > > > 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
> > > > >
> > > >
> > > >
> > > > --
> > > > wwp
> > > >
> > > > -
> > > > 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
> > >
> > > -
> > > 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
> > >
> >
> >
> > --
> > ______________________________________
> > Steve Graegert //
> > Software Consultancy // Whether you know it or not, if you
> > Mobile: +49 (176) 21248869 // are a hacker, you are a revolutionary.
> > Office: +49 (9131) 7126409 // Don't worry, you're on the right side.
> > ____________________________// -- Dr Crash / Phrack 6 / phile 3
>
> -
> 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
>
--
______________________________________
Steve Graegert //
Software Consultancy // Whether you know it or not, if you
Mobile: +49 (176) 21248869 // are a hacker, you are a revolutionary.
Office: +49 (9131) 7126409 // Don't worry, you're on the right side.
____________________________// -- Dr Crash / Phrack 6 / phile 3
-
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