steven.p.clark at gmail.com
Sat Jun 28 04:39:11 CEST 2008
> For efficiency reasons many CPUs require particular primitive data
> types (integers/pointers of various sizes) to be placed in memory at
> particular boundaries. For example, shorts ("H" above, usually two bytes
> and probably always so in the struct module) are often required to be
> on even addresses, and longer objects to be on 4 or 8 byte boundaries.
> This allows for much more efficient memory access on many platforms
> (of course the rules depend on the platform). Although RAM _appears_ to
> the random access to arbitrary bytes, the underlying hardware will often
> fetch chunks of bytes in parallel. If a number spanned the boundaries of
> such a chunk it would require two fetch cycles instead of one. So
> this is avoided for performance reasons.
> So, packing "HB" puts a short at offset 0 (even) and then a byte.
> Conversely, packing "BH" puts a byte at offset zero but puts the short
> at offset 2 (to be even), leaving a gap after the byte to achieve this,
> thus the 4 byte size of the result (byte, gap, short).
> This layout procedure is called "alignment".
> Cameron Simpson <cs at zip.com.au> DoD#743
Thanks for taking the time to type a detailed, helpful response,
Cameron. Much appreciated!
More information about the Python-list