Built-in data types shall be properly aligned, which is defined as follows:
-
1-byte, 2-byte, and 4-byte data is properly aligned when it is stored at a 1-byte, 2-byte, or 4-byte boundary, respectively.
-
8-byte data is properly aligned when it is stored on the same boundary required by the underlying hardware for atomic access to a
native int
.
Thus, int16
and unsigned int16
start on even address; int32
, unsigned int32
, and float32
start on an address divisible by 4; and int64
, unsigned int64
, and float64
start on an address divisible by 4 or 8, depending upon the target architecture. The native size types (native int
, native unsigned int
, and &
) are always naturally aligned (4 bytes or 8 bytes, depending on the architecture). When generated externally, these should also be aligned to their natural size, although portable code can use 8-byte alignment to guarantee architecture independence. It is strongly recommended that float64
be aligned on an 8-byte boundary, even when the size of native int
is 32 bits.
There is a special prefix instruction, unaligned.
, that can immediately precede an ldind
, stind
, initblk
, or cpblk
instruction. This prefix indicates that the data can have arbitrary alignment; the JIT compiler is required to generate code that correctly performs the effect of the instructions regardless of the actual alignment. Otherwise, if the data is not properly aligned, and no unaligned.
prefix has been specified, executing the instruction can generate unaligned memory faults or incorrect data.