Using alignment modes
Each data type supported by XL C/C++ is aligned along byte
boundaries according to platform-specific default alignment modes, as follows:
-
power or full, which
are equivalent.
-
linuxppc.
You can change the default alignment mode, by using any of
the following mechanisms:
- Set the alignment mode for all variables in a single file or
multiple files during compilation
- To use this approach, you specify the -qalign compiler option during compilation, with
one of the suboptions listed in Table 9.
- Set the alignment mode for all variables in a section of source
code
- To use this approach, you specify the #pragma align or #pragma options align directives in the source
files, with one of the suboptions listed in Table 9. Each directive changes the alignment mode in effect for all variables
that follow the directive until another directive is encountered, or until
the end of the compilation unit.
Each of the valid alignment modes is defined in Table 9, which provides the alignment value, in bytes, for scalar variables,
for all data types. For considerations of cross-platform compatibility, the
table indicates the alignment values for each alignment mode on the UNIX(R) platforms.
Where there are differences between 32-bit and 64-bit modes, these are indicated.
Also, where there are differences between the first (scalar) member of an
aggregate and subsequent members of the aggregate, these are indicated.
Table 9. Alignment settings (values given in bytes)
Data type |
Storage |
Alignment settings and supported platforms |
natural |
power, full |
mac68k, twobyte |
linuxppc |
bit_packed |
packed |
 |
 |
 |
 |
 |
 |
_Bool (C), bool (C++) (32-bit mode) |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
_Bool (C), bool (C++) (64-bit mode) |
1 |
1 |
1 |
not supported |
1 |
1 |
1 |
char, signed char, unsigned char |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
wchar_t (32-bit mode) |
2 |
2 |
2 |
2 |
2 |
1 |
1 |
wchar_t (64-bit mode) |
4 |
4 |
4 |
not supported |
4 |
1 |
1 |
int, unsigned int |
4 |
4 |
4 |
2 |
4 |
1 |
1 |
short int, unsigned short int |
2 |
2 |
2 |
2 |
2 |
1 |
1 |
long int, unsigned long int (32-bit mode) |
4 |
4 |
4 |
2 |
4 |
1 |
1 |
long int, unsigned long int (64-bit mode) |
8 |
8 |
8 |
not supported |
8 |
1 |
1 |
long long |
8 |
8 |
8 |
2 |
8 |
1 |
1 |
float |
4 |
4 |
4 |
2 |
4 |
1 |
1 |
double |
8 |
8 |
see note1 |
2 |
8 |
1 |
1 |
long double |
8 |
8 |
see note1 |
2 |
8 |
1 |
1 |
pointer (32-bit mode) |
4 |
4 |
4 |
2 |
4 |
1 |
1 |
pointer (64-bit mode) |
8 |
8 |
8 |
not supported |
8 |
1 |
1 |
vector types |
16 |
16 |
16 |
16 |
16 |
1 |
1 |
Notes:
- In aggregates, the first member of this data type is aligned
according to its natural alignment value; subsequent members of the aggregate
are aligned on 4-byte boundaries.
|
If you generate data with an application on one platform and read
the data with an application on another platform, it is recommended that you
use the bit_packed mode, which
results in equivalent data alignment on all platforms.
Note:
Vectors in a bit-packed structure may not be correctly aligned unless
you take extra action to ensure their alignment.
Alignment of aggregates discusses the rules for the
alignment of entire aggregates and provide examples of aggregate layouts. Alignment of bit fields discusses additional rules and considerations
for the use and alignment of bit fields, and provides an example of bit-packed
alignment.