2011-01-04 27 views

答えて

10

register変数はローカル変数の一種です。
高速アクセスのために値をレジスタに保存することのヒントです。
レジスタ変数は、グローバル変数または静的変数にすることはできません。
ブロック内でのみ定義できます。
投稿コードをフォーマットしてください

+0

このキーワードの解釈は誤解を招きます。 –

+0

@Matt Joiner:本当ですか?何故ですか? – Cratylus

-3

registerの使用は、最新のコンパイラでは廃止されました。それを使用しないでください。

これは、どの変数が最も頻繁にアクセスされるかを判断するのに十分スマートではないため、レジスタ内に永続的な場所を割り当てる必要があったのです。しかし、現代のコンパイラは、スタティック・シングル・アサインメントやレジスタ・アロケーションなどのテクニックを使用しています。これは、変数がレジスタ内にあるときと、メモリに書き込まれるべき時を知る上でコンパイラがはるかに優れているためです。

さらに、registerは、その変数に制限を設けています。ポインターはメモリの場所を指し、変数は(少なくとも概念的には)メモリにないため、register変数へのポインターを持つことはできません。 register変数は自動変数でなければなりません。これは一般に「スタック」変数と呼ばれます。したがって、関数内のローカル変数でなければならず、staticまたはexternという修飾語ではありません。

要するに、registerを使用すると、最新のコンパイラでパフォーマンスが向上することはありませんが、にプログラマーの頭痛をもたらします。早期最適化の最大の武器 - 実行時間の節約を間違った約束を持つプログラマー時間の無駄 - が再び襲います。

+1

'register'はまったく廃止されていません。あなたが言うように、変数には制約があり、これはまさにそのために設計されたものです。 –

+0

@Jens:あなたはそれが何のために設計されたと思いますか? 70年代と80年代のプログラマが変数をマシンレジスタに入れることで、より高速なコードを書くのに役立つように設計されていることがすべて示されています。アドレスの欠如は、その主な目標ではなく、その副産物です。 –

+1

@Philip:私はそれが*そのために設計されたとは言わなかった。しかし、今日では、それは、そしてなぜそれがその後のすべての標準でその場所を保ったのかです。今日のハードウェアは非常に複雑な獣です。変数を「アドレスなし」としてタグ付けして、可能な限りプロセッサに近づけることを示すことができるのは興味深い機能です。一貫性を監視することなく、レジスタ、アセンブラの即時、またはキャッシュだけで実行できます。 –

2

register変数はファイルスコープ変数が静的な記憶域を持つため、グローバル変数として使用することはできません。 register変数はまったく逆です。プログラマが自分のアドレスを決して使用しないことを約束する変数です。 2つを組み合わせることはあまり意味がありません。

ところで、表示されるエラーメッセージはそれほど役に立ちません。あなたのコンパイラは、register変数を特定のハードウェアレジスタに固定する拡張機能を参照しているようです。このようなエラーメッセージを投稿した場合は、使用しているコンパイラおよび/またはプラットフォームの情報も示してください。