c++ - Why isn't sizeof for a struct equal to the sum of sizeof of each member? -


why 'sizeof' operator return size larger structure total sizes of structure's members?

this because of padding added satisfy alignment constraints. data structure alignment impacts both performance , correctness of programs:

  • mis-aligned access might hard error (often sigbus).
  • mis-aligned access might soft error.
    • either corrected in hardware, modest performance-degradation.
    • or corrected emulation in software, severe performance-degradation.
    • in addition, atomicity , other concurrency-guarantees might broken, leading subtle errors.

here's example using typical settings x86 processor (all used 32 , 64 bit modes):

struct x {     short s; /* 2 bytes */              /* 2 padding bytes */     int   i; /* 4 bytes */     char  c; /* 1 byte */              /* 3 padding bytes */ };  struct y {     int   i; /* 4 bytes */     char  c; /* 1 byte */              /* 1 padding byte */     short s; /* 2 bytes */ };  struct z {     int   i; /* 4 bytes */     short s; /* 2 bytes */     char  c; /* 1 byte */              /* 1 padding byte */ };  const int sizex = sizeof(struct x); /* = 12 */ const int sizey = sizeof(struct y); /* = 8 */ const int sizez = sizeof(struct z); /* = 8 */ 

one can minimize size of structures sorting members alignment (sorting size suffices in basic types) (like structure z in example above).

important note: both c , c++ standards state structure alignment implementation-defined. therefore each compiler may choose align data differently, resulting in different , incompatible data layouts. reason, when dealing libraries used different compilers, important understand how compilers align data. compilers have command-line settings and/or special #pragma statements change structure alignment settings.


Comments

Popular posts from this blog

css - SVG using textPath a symbol not rendering in Firefox -

Java 8 + Maven Javadoc plugin: Error fetching URL -

node.js - How to abort query on demand using Neo4j drivers -