forcing struct allignment

Niels J|rgen Kruse njk at freja.diku.dk
Sat Jul 22 05:35:12 AEST 1989


les at chinet.chi.il.us (Leslie Mikesell) writes:

>I have a program that current writes a variety of different structs
>into a disk file and maintains the seek offsets to access them as needed.
>Is there a way to pad them such that the allignment would be correct
>if the whole file were read into a malloc()ed block of memory or would
>I still have to memcpy() each struct into a correctly alligned memory
>block before accessing the members?  When each struct is written to the
>disk, the program does not know the type of the struct that will follow.

My suggestion is:

  Let (d1,d2, .. ,dn) be the struct tags of the structs, that
  you want to handle.

  Define a union (lets call it maxalign) of all the leaf non-composite
  member types of any of the structs.

  For each of (d1,d2, .. ,dn) define a union (du1,du2, .. ,dun)
  as
        union du1 {
          struct d1 d;
          union maxalign m;
        }

  Then `sizeof (union du1) - sizeof (struct d1)' is the minimum amount
  of padding required after a struct d1, such that any struct can
  follow it. Of course, if any of the structs are smaller than
  the maxalign union, there may be some waste, but that is unavoidable
  unless you are willing to tweak the maxalign union for each machine.

Of course, wait a while to see if this is torn apart by the language gurus.
-- 
         Niels J|rgen Kruse
Email    njk at diku.dk
Mail     Tustrupvej 7, 2 tv, 2720 Vanlose, Denmark



More information about the Comp.lang.c mailing list