By default, the compiler expects conventional C and C++ pointers to point to naturally aligned words in memory because this enables the compiler to generate more efficient code.
If you want to define a pointer that can point to a word at
any address, you must specify the
when defining the pointer. For example:
__packed int *pi; // pointer to unaligned int
When a pointer is declared as
the compiler generates code that correctly accesses the dereferenced
value of the pointer, regardless of its alignment. The generated
code consists of a sequence of byte accesses, or variable alignment-dependent
shifting and masking instructions, rather than a simple
Consequently, declaring a pointer as
a performance and code size penalty.