home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1992 #18 / NN_1992_18.iso / spool / comp / lang / c / 12273 < prev    next >
Encoding:
Text File  |  1992-08-13  |  2.3 KB  |  54 lines

  1. Newsgroups: comp.lang.c
  2. Path: sparky!uunet!mcsun!Germany.EU.net!Urmel.Informatik.RWTH-Aachen.DE!physik.tu-muenchen.de!berg
  3. From: berg@physik.tu-muenchen.de (Stephen R. van den Berg)
  4. Subject: Re: Memory alignment of struct elements
  5. Message-ID: <1992Aug13.131005.7040@Urmel.Informatik.RWTH-Aachen.DE>
  6. Originator: berg@tabaqui
  7. Sender: news@Urmel.Informatik.RWTH-Aachen.DE (Newsfiles Owner)
  8. Nntp-Posting-Host: tabaqui
  9. Organization: Rechnerbetrieb Informatik  /  RWTH Aachen
  10. References: <1992Aug12.133132.10723@Princeton.EDU>
  11. Date: Thu, 13 Aug 92 13:10:05 GMT
  12. Lines: 40
  13.  
  14. >I am writing the software for a big database and the space is very
  15. >important. If I try to use a 
  16.  
  17. >struct { char ch ; float f }
  18.  
  19. >the compiler (both in SunOS 4.0.1 and Interactive SYSVR3) allocates
  20. >8 bytes for it, starting the "f" element at fifth byte of the structure.
  21. >This makes both reading and writing such records from/to a binary database 
  22. >file (consisting of 5-byte-long records) very inconvinient, requiring
  23. >a declaration of character array of 5 bytes and using "memcpy()". Is there 
  24. >a way to force the compiler to align the struct elements following their 
  25. >true length?
  26.  
  27. What you should do in such a case, is to arrange all the elements in the
  28. struct in reverse size order.  Of course, this order might be a bit compiler
  29. dependent, but you can make good guesses about it, and in your case, it
  30. will probably be portable to every machine you will ever need it on.
  31.  
  32. So, declare the struct as:
  33.  
  34.     struct mystruct {float f;char ch;};
  35.  
  36. And, for reading and writing this struct, use the following length:
  37.  
  38. #define sizeof_mystruct    (offsetof(struct mystruct,ch)+sizeof(char))
  39.  
  40. Which will, most probably, be five on both architectures; do note however that
  41. the actual size of the struct will still be eight.
  42.  
  43. This, of course, is only useable if you have the ability to reverse the order
  44. (i.e. the database file format is still changeable), and you don't try to
  45. read complete arrays from the database at once.
  46.  
  47. In all other cases, using memcpy is inevitable, since alignment (e.g. on
  48. SPARCs) is not for the compiler to determine, it often is hardware dependent.
  49. -- 
  50. Sincerely,                                  berg@pool.informatik.rwth-aachen.de
  51.            Stephen R. van den Berg (AKA BuGless).    berg@physik.tu-muenchen.de
  52.  
  53. "Good moaning!"
  54.