Structure Padding

A structure allows several related objects, called structure members, to be grouped into one aggregate object and are fully described in the structures page.

The size of a structure member is identical to the size of an ordinary object with the same type as that member; however, the size of a structure might not be equal to the sum of the sizes of its structure members; specifically, it might be larger.

The C Standard requires that structure members have addresses that increase in the order in which they are declared. It also states that the address of a structure’s initial member must be the same as the address of the structure itself. However, compilers are allowed to shift the addresses of subsequent members so that they align with address boundaries that make accessing the member efficient for the target device. These shifts mean that there could be gaps in the structure that are not used for storage but that will contribute to the size of the overall structure.

Never make assumptions about the size of structures. Always use the sizeof() operator to obtain a structure’s size. Do not assume that a structure member follows immediately in memory after the previous member. Always use the address operator, &, to obtain the address of a structure member.

Structure padding implies that you should be careful using a char pointer to access each byte of a structure, since some of those bytes might be padding and hold meaningless values.

Some compilers might pack structure members on an alignment which is equal to the size of that member, so the ordering of the members can affect the structure size. If desired, you can place members with the same size sequentially.

For example, the structure:

might be smaller than the following structure which has the same members, but which defines them in a different order.

For comparison, even though the MPLAB® XC8, XC16 and XC32 C compilers all use a 1-byte-wide char and a 4-byte-wide long type, the size of the last structure shown is 10 bytes when compiling with XC8, 12 bytes when compiling with XC16, and 16 bytes when compiling with XC32. The differences are purely a result of padding between the structure members.

Remember that the compiler must allocate memory for members in the same order as they are defined, so a change in the order of members cannot be performed as an optimization by the compiler.

© 2016 Microchip Technology, Inc.
Information contained on this site regarding device applications and the like is provided only for your convenience and may be superseded by updates. It is your responsibility to ensure that your application meets with your specifications. MICROCHIP MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND WHETHER EXPRESS OR IMPLIED, WRITTEN OR ORAL, STATUTORY OR OTHERWISE, RELATED TO THE INFORMATION, INCLUDING BUT NOT LIMITED TO ITS CONDITION, QUALITY, PERFORMANCE, MERCHANTABILITY OR FITNESS FOR PURPOSE. Microchip disclaims all liability arising from this information and its use. Use of Microchip devices in life support and/or safety applications is entirely at the buyer's risk, and the buyer agrees to defend, indemnify and hold harmless Microchip from any and all damages, claims, suits, or expenses resulting from such use. No licenses are conveyed, implicitly or otherwise, under any Microchip intellectual property rights.