ストレージ クラスは、register
オブジェクトがレジスタに格納されることを意味するものではありません。標準は次のように述べています。
ストレージ クラス指定子を使用したオブジェクトの識別子の宣言は、オブジェクトregister
へのアクセスが可能な限り高速であることを示唆しています。そのような提案が有効である範囲は、実装によって定義されます。
(引用は ISO C 標準のN1570ドラフト、セクション 6.7.1 パラグラフ 6 からのものです。)
オブジェクトをメモリではなく CPU レジスタに格納することは、これを実現する 1 つの方法ですが、唯一の方法ではありません。
最新のコンパイラ (少なくとも一般的な知恵によると) は、速度のためにどの変数をレジスタに格納する必要があるかを決定するのにおそらく優れているため、register
キーワードを使用しても、コンパイラの最適化に干渉する以外はおそらく何もしません。
register
また、オブジェクトのアドレスを取得することも違法になります (メモリに格納されている場合でも)。
これは基本的に、最新のコンパイラが行う高度な最適化を実行しなかった初期のコンパイラ (1970 年代) からの名残りです。このようなコンパイラでregister
は、パフォーマンスが大幅に向上する可能性があります。
(最新のコンパイラは、すべての変数をレジスタに割り当てることができると仮定することから始めて、変数のアドレスが必要な場合や、使用可能なレジスタが十分にない場合など、必要な場合にのみそれらをメモリに「スピル」します。)