Re:sizeof and allignment on 32bit target

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



#define _ALIGN1_ __attribute__ ((aligned (1)))
#define _ALIGN2_ __attribute__ ((aligned (2)))
#define _ALIGN4_ __attribute__ ((aligned (4)))
#define _PACKED_ __attribute__ ((packed))

Caution:  note that _ALIGN1_, _ALIGN2_, _ALIGN4_ and _PACKED_ are all reserved identifiers.

All identifiers with two adjacent underscores anywhere in the identifier is reserved for compiler use.

All identifiers with a leading underscore followed by a capital letter is reserved for compiler use.

2nd caution:  packing and aligning/realigning/misaligning may cause SEGBUS errors and porting issues.  Strongly NOT recommended.

Often "packing" is desired for writing out a structures "as-is", binary, to disk or over an IP connection.  I highly recommend writing a utility routine to do that for you.  Example....

struct TestStruct {
  struct Value {
    unsigned long Value1;
     unsigned long Value2;
     unsigned short Value3;
    } Value;
  unsigned long Value4;

  void write(std::ostream& binaryStream);
  void read(std::istream& binaryStream);
} Test;

Note:  the << and >> streaming operators really should be for textual (human-readable) formats, not binary formats.  The write/read methods are the ones ( by convention) for the serialization/marshalling of canonical binary formats.

For my own use, I would do something like:

struct TestStruct {
  struct Value {
    unsigned long Value1;
     unsigned long Value2;
     unsigned short Value3;
    } Value;
  unsigned long Value4;

  void write(std::ostream& binaryStream);
  void read(std::istream& binaryStream);

private:
  typedef char byte; // Or "typedef char octet" if you prefer.
  struct TestStructRec { // I/O, binary layout.
    byte Value_Value1[4]; // MSB
    byte Value_Value2[4]; // MSB
    byte Value_Value3[2]; // MSB
    byte Value4[4]; // MSB
  };
} Test;

And at some point, I'd change 'struct TestStruct' to 'class TestStruct', because it's beginning to look less-and-less like a passive data structure, and more like an object (or actor) that knows about itself and can perform a set of operations (such as write and read).

HTH,
--Eljay



[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux