2016-06-29 39 views
0

今すぐストレージクラスについて学んでいますhere。そして彼は、オートストレージクラスとレジスタストレージクラスについて同じことを説明しているようです。彼が2つに分かれているのは、レジスタストレージクラスがCPUレジスタに格納されているということだけです。これらのストレージクラス間に拡散がありますか?レジスタ記憶クラスの使用一部のCコンパイラでは、デフォルトでRegister Keywordが使用されていますか?登録と自動ストレージクラスの登録?

+1

ブロックスコープオブジェクトはデフォルトで 'auto'であるため、指定子は全く役に立たない。 'register'はlobotomizedコンパイラの問題です。 – EOF

+0

そしてなぜLobotomizedコンパイラでのみ重要ですか?それはどういう意味ですか? @EOF – amanuel2

+1

'gcc'、' icc'や 'clang'のような現代的なコンパイラを使用し、最適な最適化設定を有効にすると、コンパイラはアドレスを持たないオブジェクトを割り当てます(または、アドレスは関数をエスケープしません)を「レジスタ」として宣言したかどうかにかかわらず、CPUレジスタに保持されます。 – EOF

答えて

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

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

ストレージクラス 指定子registerとオブジェクトの識別子の宣言は、オブジェクトへのアクセスを可能として として高速であることを示唆しています。そのような提案の有効範囲は、実装定義の です。 CPUレジスタにではなくメモリ内のオブジェクトを格納

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

はそれを達成するための一つの方法です、唯一のものではありません。

現代のコンパイラ(おそらく、一般的な知恵によると)はおそらく、どの変数を高速でレジスタに格納するかを決めるよりも優れているので、registerキーワードを使用すると、コンパイラの最適化。

registerも、(メモリに格納されていても)オブジェクトのアドレスを取得するのは不正です。

これは基本的には、現代のコンパイラが行う洗練された最適化を行わなかった初期のコンパイラ(1970年代)のホールドオーバーです。このようなコンパイラでは、パフォーマンスを大幅に向上させる可能性があります。

(現代のコンパイラは、変数のアドレスが必要であるか、または十分なレジスタがないために、必要なときにのみ、すべての変数をレジスタに割り当ててメモリに "流し込む" 。)

+0

まずはお会いしましたか?あなたは議会のチャットルームの人ですか?二番目に....ええ、私はどこかで最後のコメントを聞いたことがあります。あなたのanwserにおかげでたくさんありがとう:) – amanuel2

+0

@Dsafds:いいえ、私はアセンブリのチャットルームではない(それが何であるかわからない)。そして、あなたは大歓迎です。 –

+0

簡単な質問Keith、なぜautoキーワードを使用するのでしょうか?それはデフォルトにjsutそれdosent?そして、申し訳ありません私は私たちが会ったと思って、誰かのアバターはあなたと同じか、まあまあ同じように見えます。 – amanuel2

関連する問題