32 ビット CPU は通常、内部で 32 ビット値を操作する CPU ですが、8/16 ビット値で同じ操作を実行する場合に遅くなるわけではありません。たとえば、x86 は 8086 まで下位互換性があり、レジスタの端数を操作できます。つまり、レジスターが 32 ビット幅であっても、そのレジスターの最初の 16 ビットまたは最初の 8 ビットでしか操作できず、速度がまったく低下しません。この概念は、レジスタが 64 ビットである x86_64 でも採用されていますが、最初の 32、16、または 8 ビットでしか動作できません。
また、x86 CPU は、まだキャッシュにない場合は常にメモリからキャッシュ ライン全体をロードし、いずれにしてもキャッシュ ラインは 4 バイトより大きい (32 ビット CPU の場合は 8 または 16 バイトではなく) ため、メモリから 2 バイトをロードするのと同じくらい高速です。メモリから 4 バイトを読み込みます。メモリから多くの値を処理する場合、メモリ転送が少ないため、16 ビット値は実際には 32 ビット値よりもはるかに高速になる場合があります。キャッシュ ラインが 8 バイトの場合、キャッシュ ラインごとに 4 つの 16 ビット値がありますが、32 ビット値は 2 つしかありません。したがって、16 ビット整数を使用すると、4 つの値ごとに 1 つのメモリ アクセスがあり、32 ビット整数を使用すると、2 つの値ごとに 1 つのメモリ アクセスがあります。となり、大きな int 配列を処理するための転送が 2 倍になります。
たとえば PPC などの他の CPU は、レジスタの一部のみを処理することはできず、常に完全なレジスタを処理します。しかし、これらの CPU には通常、メモリから 16 ビット値をロードし、それを 32 ビットに拡張してレジスタに書き込むなど、特別なロード操作があります。その後、レジスタから値を取得し、最後の 16 ビットのみをメモリに格納する特別なストア操作があります。どちらの操作も、32 ビットのロード/ストアが必要とするのと同じように、1 つの CPU サイクルしか必要としないため、速度の違いもありません。また、PPC はレジスタでしか算術演算を実行できないため (x86 とは異なり、メモリを直接操作することもできます)、このロード/ストア手順は、32 ビット整数または 16 ビット整数のどちらを使用しても実行されます。
唯一の欠点は、フル レジスタでしか操作できない 32 ビット CPU で複数の操作をチェーンする場合、次の操作を実行する前に、最後の操作の 32 ビットの結果を 16 ビットに「カットバック」する必要がある場合があることです。そうしないと、結果が正しくない可能性があります。ただし、このような削減は 1 つの CPU サイクルにすぎません (単純な AND 演算)。コンパイラは、そのような削減が本当に必要な場合と、省略した場合に最終結果に影響を与えない場合を判断するのが得意です。 、したがって、そのようなカットバックはすべての命令の後に実行されるのではなく、本当にやむを得ない場合にのみ実行されます。一部の CPU は、そのようなカットバックを不要にするさまざまな「強化された」命令を提供します。私は、生成されたアセンブリ コードを見て、そのようなカットバックを期待していた私の人生でたくさんのコードを見てきました。
したがって、ここで一般的なルールを期待している場合は、がっかりする必要があります。16 ビット操作が 32 ビット操作と同等に高速であると断言することも、32 ビット操作が常に高速であると断言することもできません。それはまた、あなたのコードがそれらの数字で何をしているのか、そしてそれがどのようにそれをしているのかにも依存します. 特定の 32 ビット CPU で 32 ビット操作が 16 ビット操作の同じコードよりも高速であるというベンチマークを見たことがありますが、その反対が当てはまることも既に確認しました。あるコンパイラから別のコンパイラに切り替えたり、コンパイラのバージョンをアップグレードしたりしても、すべてが元に戻る場合があります。私が言えることは次のことだけです: short での作業は int での作業よりも大幅に遅いと主張する人は誰でも、その主張のサンプル ソース コードを提供し、テストに使用した CPU とコンパイラの名前を付けてください。過去 10 年ほどの間、そのようなことは一度も経験したことがないからです。int を使用した方がおそらく 1 ~ 5% 速い場合もありますが、10% 未満のものは「重要」ではなく、問題は、場合によってはメモリを 2 倍無駄にする価値があるかということです。 2%のパフォーマンス?私はそうは思わない。