2016-07-04 14 views
4

"Thinking in C++"レジスタ変数について: "レジスタ変数の使用には制限があります。レジスタ変数のアドレスは取ることも計算することもできません。レジスタ変数はブロック内でのみ宣言できます(グローバルまたは静的なレジスタ変数を持つことはできません)。なぜ私はレジスタ変数のアドレスを取ることができますか?

だから私は、テストにプログラムのこの作品を書いた:

int global = 2; 
// error 
// register int global2 = 3; 

int main() { 
    register int local2 = 2; 
    cout << local2 << " " << &local2 << endl; 
} 

エラーが発生していないとLOCAL2のアドレスがプリントアウトされた++ただしグラムを。だから、なぜ私はエラーなしでアドレスを取ることができますか?

+1

これは単なるコンパイラのヒントです。変数の処理は言語レベルで変更されません。 –

+2

'register'はヒントとしてのみ機能します。変数のアドレスを取得すると、 'register'を使用したかどうかにかかわらず、アドレスを取得します。 – Dmitri

+0

[C++でのキーワード登録](http://stackoverflow.com/questions/3207018/register-keyword-in-c) – deW1

答えて

1

g ++はあなたのregister宣言に従わないことを選択しています。これは必須ではなく、この場合、無視するか、変数のアドレスを取るために無効にするかのいずれかを選択することができます。

以前はC言語でアセンブリ言語を書こうとしていましたが、私たちのプロセッサが持つレジスタの数はあまりにも多く、CPUリソースを割り当てる時代のコンパイラよりも賢かったと思いました。

プロセッサーがはるかに複雑になっているため、コンパイラーははるかに高度化しています(最新のIntelプロセッサーでは、ロード命令自体は完成しています)、我々のウェットウェアは本質的に同じままです。

+0

私は無視されるとは思わない。グローバルレジスタ変数はエラーを生成します。 – darklord

5

歴史的には、変数registerのアドレスを取ることができませんでした。

これは単なる歴史的な脚注です。現在のC++標準状態registerキーワード

は...という名前の変数は、自動記憶域期間 (3.7.3)を持っていることを指定すること。

つまり、何も意味がありません。 register変数のアドレスを取ることができないという制限は、現在のC++標準の一部ではなくなりました。

関連する問題