0

ここでストレージクラスについて学んでいます。そして、彼は auto ストレージ クラスと register ストレージ クラスについて同じことを説明しているようです。彼がこの 2 つを区別した唯一の点は、レジスタ ストレージ クラスが CPU レジスタに格納されていることです。これらのストレージ クラスの間に違いはありますか? register ストレージ クラスの用途はありますか? 一部の C コンパイラでは、Register キーワードがデフォルトで指定されていますか?

register int x = 5;
auto int y = 3;
4

1 に答える 1

4

ストレージ クラスは、registerオブジェクトがレジスタに格納されることを意味するものではありません。標準は次のように述べています。

ストレージ クラス指定子を使用したオブジェクトの識別子の宣言は、オブジェクトregisterへのアクセスが可能な限り高速であることを示唆しています。そのような提案が有効である範囲は、実装によって定義されます。

(引用は ISO C 標準のN1570ドラフト、セクション 6.7.1 パラグラフ 6 からのものです。)

オブジェクトをメモリではなく CPU レジスタに格納することは、これを実現する 1 つの方法ですが、唯一の方法ではありません。

最新のコンパイラ (少なくとも一般的な知恵によると) は、速度のためにどの変数をレジスタに格納する必要があるかを決定するのにおそらく優れているため、registerキーワードを使用しても、コンパイラの最適化に干渉する以外はおそらく何もしません。

registerまた、オブジェクトのアドレスを取得することも違法になります (メモリに格納されている場合でも)。

これは基本的に、最新のコンパイラが行う高度な最適化を実行しなかった初期のコンパイラ (1970 年代) からの名残りです。このようなコンパイラでregisterは、パフォーマンスが大幅に向上する可能性があります。

(最新のコンパイラは、すべての変数をレジスタに割り当てることができると仮定することから始めて、変数のアドレスが必要な場合や、使用可能なレジスタが十分にない場合など、必要な場合にのみそれらをメモリに「スピル」します。)

于 2016-06-29T22:42:39.337 に答える