C++のregisterストレージクラス(記憶クラス指定子)とは
registerストレージクラスの基本
C言語における「register」は、記憶クラス指定子(ストレージクラス指定子)の一つで、対象となるオブジェクトをマシンのレジスタに格納すべきであることをコンパイラに伝える役割を持っています。
使用目的と実際の動作
この指定子は、ループ制御変数など、プログラム中で頻繁にアクセスされる変数に対して指定されるのが一般的です。メモリではなくレジスタから直接読み書きすることでアクセス時間を最小限に抑え、パフォーマンスの向上が期待できるためです。
ただし、注意すべき点として、コンパイラがこの要求に従う義務はないということが挙げられます。ほとんどのシステムでは利用可能なレジスタのサイズや本数に厳しい制限があるため、実際にレジスタへ配置できる変数はごくわずかです。現代の最適化コンパイラは独自の判断でレジスタ割り付けを行うため、明示的な指定はあまり意味を持ちません。
C++におけるregisterキーワードの扱い
一方、C++において「register」は、実質的には使われていない予約語(キーワード)となっています。これは、既存のC言語コードとの構文的な互換性を保つために残されたものだと考えるのが妥当でしょう。
なお、C++ではC++14でこの指定子が非推奨(deprecated)となり、C++17以降はストレージクラス指定子としての機能自体が削除されました。現在では単なる予約語として扱われており、新しいコードで使用することは推奨されません。
-
C++で解く「迷路 II」問題 ― 壁に当たるまで転がるボールの最短距離をBFSで求める
問題概要 空きマスと壁からなる迷路の中にボールがあります。ボールは上・下・左・右のいずれかの方向に転がって空きマスを進むことができますが、壁にぶつかるまで止まることはできません。ボールが停止したときに、初めて次の方向を選ぶことができます。 ボールのスタート位置、目的地、そして迷路そのものが与えられるので、ボールが目的地で停止するまでの最短距離を求めてください。ここでの距離とは、ボールが転がって通過した空きマスの数のことです(スタート位置は含まず、目的地は含みます)。どうしても目的地で停止できない場合は -1 を返します。 迷路は2次元配列で表現されます。1 が壁、0 が空きスペースを意味し、迷
-
C++で解く迷路問題:転がるボールが目的地に止まれるかをBFSで判定する方法
迷路の中にボールがあるとします。迷路には空きスペース(通路)と壁があります。ボールは上下左右のいずれかの方向に転がって空き通路を進むことができますが、壁にぶつかるまで止まりません。ボールが停止したときに、次の方向を選べます。この問題では、ボールの開始位置、目的地、そして迷路そのものが与えられ、「ボールが目的地の位置で停止できるかどうか」を判定する必要があります。迷路は2次元配列で表現され、1は壁、0は空きスペースを意味します。迷路の外周はすべて壁になっています。開始位置と目的地は行・列のインデックス(座標)で与えられます。問題例たとえば、次のような2次元配列で表される迷路を考えてみましょう。0