私が知っている C 実装は、これを理解するのに役立つプリプロセッサ マクロを提供していません。あなたのコードはおそらくさまざまなマシンで実行されるため、テスト用にさまざまなマシンにアクセスできると想定しているため、テスト プログラムで答えを見つけることができます。次に、以下のような独自のマクロを作成できます。
#if defined(__sparc__)
/* Unaligned access will crash your app on a SPARC */
#define ALIGN_ACCESS 1
#elif defined(__ppc__) || defined(__POWERPC__) || defined(_M_PPC)
/* Unaligned access is too slow on a PowerPC (maybe?) */
#define ALIGN_ACCESS 1
#elif defined(__i386__) || defined(__x86_64__) || \
defined(_M_IX86) || defined(_M_X64)
/* x86 / x64 are fairly forgiving */
#define ALIGN_ACCESS 0
#else
#warning "Unsupported architecture"
#define ALIGN_ACCESS 1
#endif
アラインされていないアクセスの速度は、交差する境界に依存することに注意してください。たとえば、アクセスが 4k ページの境界をまたぐ場合は、はるかに遅くなり、さらに遅くなる原因となる他の境界が存在する可能性があります。x86 でも、一部のアライメントされていないアクセスはプロセッサによって処理されず、代わりに OS カーネルによって処理されます。それは信じられないほど遅いです。
また、将来 (または現在) の実装によって、アラインされていないアクセスのパフォーマンス特性が突然変化しないという保証もありません。これは過去に発生しており、将来発生する可能性があります。PowerPC 601 はアラインされていないアクセスに対して非常に寛容でしたが、PowerPC 603e はそうではありませんでした。
状況をさらに複雑にしているのは、アラインされていないアクセスを作成するために作成するコードが、プラットフォーム間で実装が異なるという事実です。たとえば、PowerPC では、 32 ビットの場合、 x << 32andx >> 32は常に 0であるという事実によって単純化されてxいますが、x86 ではそのような運はありません。