register ストレージ・クラス指定子は、オブジェクトの値をマシン・レジスター に常駐させるようにコンパイラーに指示します。コンパイラーは、この要求を満たす必要があり ません。多くのシステムで使用できるレジスターのサイズと数は制限されているので、 実際にレジスターに書き込まれる変数は少なくなります。 コンパイラーが、マシン・レジスターを register オブジェクトに割り振らない場合、 そのオブジェクトは、ストレージ・クラス指定子 auto を持っているものとして扱われます。 register ストレージ・クラス指定子を使用することで、ループ制御変数などのオブ ジェクトが頻繁に使 用されているので、アクセス時間を最小化してパフォーマンスを上げるようプ ログラマーが望んでいることを知らせます。
register ストレージ・クラス指定子を持つオブジェクトは、ブロック内に定義するか、 または関数へのパラメーターとして宣言する必要があります。
パラメーターを除く register オブジェクトを初期化できます。自動オブジェクトを初期化しない場合は、 その値は確定できません。初期値を提供する場合は、初期値を表す式を C または C++ の有効な式にすることができます。オブジェクトの定義を含むプログラム・ブロックに入るたびに、 オブジェクトはその初期値にセットされます。
register ストレージ・クラス指定子があるオブジェクトには、自動ストレージ期間が指定されます。 ブロックに入るたびに、そのブロックに定義された register オブジェクトに対するストレージが 使用可能になります。ブロックが終了すると、そのオブジェクトは使用できなくなります。
再帰的に呼び出す関数に register オブジェクトが定義される場合は、 ブロックが呼び出されるたびに、メモリーを変数に割り振ります。
register オブジェクトは auto ストレージ・クラスのオブジェクトと同等に扱われるため、リンケージはありません。
制約事項
制約事項
register int i; int* b = &i; // valid in C++, but not in C
関連参照