HP 3000 Manuals

Alignment within Structures [ HP C Programmer's Guide ] MPE/iX 5.0 Documentation


HP C Programmer's Guide

Alignment within Structures 

In a structure, each member is allocated sequentially at the next
alignment boundary corresponding to its type.  Therefore, the structure
might be padded internally if its members' types have different alignment
requirements.  In a union, all members are allocated starting at the same
memory location.  Both structures and unions can have padding at the end,
in order to make the size a multiple of the alignment.

The code fragment in Figure 2-2  illustrates the alignment on various
systems.
______________________________________________________________
|                                                            |
|     struct x {                                             |
|        char y[3];                                          |
|        short z;                                            |
|        char w[5];                                          |
|     };                                                     |
|                                                            |
|     struct q {                                             |
|        char n;                                             |
|        struct x v[2];                                      |
|        double u;                                           |
|        char t;                                             |
|        int s:6;                                            |
|        char m;                                             |
|     } a = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,|
|            20.0,21,22,23};                                 |
______________________________________________________________

          Figure 2-2.  Code Fragment for Comparing Storage and Alignment 

HP C/HP-UX Series 700/800 and HP C/iX 

Figure 2-3 shows how the data in Figure 2-2  is stored in memory when
using HP C on the HP 9000 Series 700/800 and HP 3000 Series 900.  The
values are shown above the variable names.  Shaded cells indicate padding
bytes.

[]
Figure 2-3. Storage with HP C on the HP 9000 Series 700/800 and HP 3000 Series 900 The struct q is aligned on an 8-byte boundary because the most restrictive data type within the structure is the double u. Table 2-2 shows the padding for the example code fragment: Table 2-2. Padding on HP 9000 Series 700/800 and HP 3000 Series 900 --------------------------------------------------------------------------------------------- | | | | Padding Location | Reason for Padding | | | | --------------------------------------------------------------------------------------------- | | | | a+1 | The most restrictive type of the structure x is short; therefore, the | | | structure is 2-byte aligned. | | | | --------------------------------------------------------------------------------------------- | | | | a+5 | Aligns the short z on a 2-byte boundary. | | | | --------------------------------------------------------------------------------------------- | | | | a+13 | Fills out the struct x to a 2-byte boundary. | | | | --------------------------------------------------------------------------------------------- | | | | a+17 | Aligns the short z on a 2-byte boundary. | | | | --------------------------------------------------------------------------------------------- | | | | a+25 | Fills out the structure to a 2-byte boundary. | | | | --------------------------------------------------------------------------------------------- | | | | a+26 through a+31 | Aligns the double u on an 8-byte boundary. The bit-field s begins | | | immediately after the previous item at a+41. Two bits of padding is | | | necessary to align the next byte properly. | | | | --------------------------------------------------------------------------------------------- | | | | a+43 through a+47 | Fills out the struct q to an 8-byte boundary. | | | | --------------------------------------------------------------------------------------------- HP C on the Series 300/400 The differences between HP C on the HP 9000 Series 300/400 and HP C on the HP 9000 Series 700/800 and HP 3000 Series 900 are: * On the Series 300/400, a structure is aligned on a 2-byte boundary. On the HP 9000 Series 700/800 and HP 3000 Series 900, it is aligned according to the most restrictive data type within the structure. * On the Series 300/400, the double data type is 2-byte aligned within structures. It is 8-byte aligned on the HP 9000 Series 700/800 and HP 3000 Series 900. * On the Series 300/400, the long double, available in ANSI mode only, is 2-byte aligned within structures. The long double is 8-byte aligned on the HP 9000 Series 700/800 and HP 3000 Series 900. * On the Series 300/400, the enumerated data type is 2-byte aligned in a structure, array, or union. The enumerated type is always 4-byte aligned on the HP 9000 Series 700/800 and HP 3000 Series 900, unless a sized enumeration is used. When the sample code fragment is compiled and run, the data is stored as shown in Figure 2-4 :
[]
Figure 2-4. Storage with HP C on the HP 9000 Series 300/400 Table 2-3 shows the padding for the example code fragment: Table 2-3. Padding on the HP 9000 Series 300/400 --------------------------------------------------------------------------------------------- | | | | Padding Location | Reason For Padding | | | | --------------------------------------------------------------------------------------------- | | | | a+1 | Within structures align short on a 2-byte boundary. | | | | --------------------------------------------------------------------------------------------- | | | | a+5 | Aligns the short z on a 2-byte boundary. | | | | --------------------------------------------------------------------------------------------- | | | | a+14 | Structures within structures are aligned on a 2-byte boundary. | | | | --------------------------------------------------------------------------------------------- | | | | a+17 | Aligns the short z on a 2-byte boundary. | | | | --------------------------------------------------------------------------------------------- | | | | a+25 | Doubles are 2-byte aligned within structures. | | | | --------------------------------------------------------------------------------------------- | | | | a+37 | Pads a to a 2-byte boundary. | | | | --------------------------------------------------------------------------------------------- CCS/C on the HP 1000 and HP 3000 Figure 2-5 shows how the members of the structure defined in Figure 2-2 are aligned in memory when using CCS/C on the HP 1000 or HP 3000:
[]
Figure 2-5. Storage with CCS/C
NOTE All data types and structures are 2-byte aligned when using CCS/C on the HP 1000 or HP 3000.
Table 2-4 shows the padding for the example code fragment: Table 2-4. Padding with CCS/C --------------------------------------------------------------------------------------------- | | | | Padding Location | Reason for Padding | | | | --------------------------------------------------------------------------------------------- | | | | a+1 | Aligns the structure on a 2-byte boundary. | | | | --------------------------------------------------------------------------------------------- | | | | a+5 | Aligns the short z on a 2-byte boundary. | | | | --------------------------------------------------------------------------------------------- | | | | a+13 | Fills out the struct x to a 2-byte boundary. (Aligns the character | | | on a 2-byte boundary.) | | | | --------------------------------------------------------------------------------------------- | | | | a+17 | Aligns the short z on a 2-byte boundary. | | | | --------------------------------------------------------------------------------------------- | | | | a+25 | Fills out the structure to a 2-byte boundary and aligns the double u | | | on a 2-byte boundary. | | | | --------------------------------------------------------------------------------------------- | | | | a+37 | Pads a to a 2-byte boundary. | | | | --------------------------------------------------------------------------------------------- VAX/VMS C The differences between HP C and VAX/VMS C are: * In HP C Series 700/800, the double type is 8-byte aligned; in VAX/VMS C, the double type is 4-byte aligned. * In HP C, bit-fields are packed from left to right. In VAX/VMS C, the fields are packed from right to left. * HP C uses big-endian data storage with the most significant byte on the left. VAX/VMS C uses little-endian data storage with the most significant byte on the right. (See the swab function in the HP-UX Reference manual for information about converting from little-endian to big-endian.) In VAX/VMS C, the data from the program in Figure 2-2 is stored as shown in Figure 2-6:
[]
Figure 2-6. Storage on VAX/VMS C Table 2-5 shows the padding for the example code fragment: Table 2-5. Padding on VAX/VMS C --------------------------------------------------------------------------------------------- | | | | Padding Location | Reason for Padding | | | | --------------------------------------------------------------------------------------------- | | | | a+1 | The most restrictive type of any struct x member is short; therefore, | | | struct x is 2-byte aligned. | | | | --------------------------------------------------------------------------------------------- | | | | a+5 | Aligns the short z on a 2-byte boundary. | | | | --------------------------------------------------------------------------------------------- | | | | a+13 | Fills out the struct x to a 2-byte boundary. | | | | --------------------------------------------------------------------------------------------- | | | | a+17 | Needed for alignment of the short z. | | | | --------------------------------------------------------------------------------------------- | | | | a+25 through a+27 | Fills out the structure to a 2-byte boundary and aligns the double u | | | on a 4-byte boundary. | | | | --------------------------------------------------------------------------------------------- | | | | a+37 | Aligns the char m on a byte boundary. | | | | --------------------------------------------------------------------------------------------- | | | | a+39 | Fills out the structure to a 4-byte boundary. | | | | ---------------------------------------------------------------------------------------------


MPE/iX 5.0 Documentation