Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

C言語のregister(レジスタ)記憶クラスとは?特徴と使い方を実例付きで解説

C言語には、変数の記憶場所・有効範囲(スコープ)・寿命を制御するための記憶クラス(ストレージクラス)が4種類用意されています。

  • auto
  • extern
  • static
  • register

register(レジスタ)変数とは

  • 宣言に使用するキーワードは register です。

  • 通常の変数はメインメモリ上に格納されますが、register変数はCPU内部のレジスタに格納されます。

  • レジスタとは、CPU内に備わっている一時的な記憶ユニットのことです。

  • メモリへのアクセスよりもレジスタへのアクセスの方がはるかに高速なため、register変数は通常の変数よりも速く読み書きできます。

そのため、for文のカウンタなど、何度も繰り返しアクセスされる変数に対して register を指定すると、処理速度の向上が期待できます。

サンプルコード1:基本的な使い方

以下は、register記憶クラスを使用したC言語プログラムの例です。

#include<stdio.h>
main(){
    register int i;
    for(i=1; i<=5; i++)
        printf("%d ", i);
}

実行結果

1 2 3 4 5

ループカウンタ i を register変数として宣言することで、繰り返し処理の中で何度も発生する変数アクセスが高速化されます。

サンプルコード2:初期化しなかった場合の出力

続いて、初期化せずに register変数を出力する例を見てみましょう。

#include<stdio.h>
int main(){
    register int a;
    printf("%d", a); // a の値を出力
}

実行結果

0

※なお、ローカル変数(auto/register含む)の初期値は環境によって不定となる場合があります。実務では、必ず明示的に初期化してから使用するようにしましょう。

サンプルコード3:register変数のアドレスは取得できない

register変数は必ずしもメモリ上に配置されるわけではないため、&演算子でアドレスを取得しようとするとコンパイルエラーになります。これはregister記憶クラスの重要な制約です。

#include<stdio.h>
int main(){
    register int i = 10;
    int *p;
    p = &i; // エラー:register変数のアドレスは要求できない
    printf("Value of i: %d", *p);
    return 0;
}

実行結果

Error: address of register variable requested

まとめ

register記憶クラスは、頻繁にアクセスされる変数をCPUのレジスタに配置することでアクセス速度の向上を狙う指定方法です。ただし現代のコンパイラは最適化機能により自動的にレジスタ割り付けを行うため、明示的に指定する場面は限られています。また、「アドレス演算子 & が使えない」という制約がある点にも十分注意してください。

  1. クラウドストレージとは?仕組み・バックアップとの違い・選び方を徹底解説

    クラウドストレージとは、ファイルをインターネット上(クラウド)に保存する仕組みのことです。パソコンの内蔵HDDや外付けハードディスク、USBメモリにデータを保管する代わりに、オンライン上にファイルを置いておくことができます。クラウドストレージを利用する理由はさまざまです。ローカルディスクの空き容量が不足している場合、クラウドを追加の保存先として活用できます。音楽コレクションをどこからでもストリーミング再生したい、自宅から仕事のファイルにアクセスしたい、旅行の動画を手軽に共有したい——そんなニーズにも応えられます。さらに、重要なファイルをパスワードと暗号化でしっかり保護したいという場合にも有効で

  2. C++の記憶クラス(ストレージクラス)とは?auto・static・externなどの5種類を解説

    C++プログラミングにおいて、記憶クラス(ストレージクラス)とは、変数や関数のスコープ(可視性)と寿命(ライフタイム)を定義するための指定子です。記憶クラス指定子は、修飾対象となる型の前に記述します。C++プログラムで使用できる記憶クラスには、以下の5種類があります。 auto register static extern mutable auto:自動記憶域期間 auto記憶クラス指定子は、自動記憶域を持つ変数を明示的に宣言するためのものです。ブロック内で宣言された変数のデフォルトはautoであり、自動記憶域を持つ変数xは、xが宣言されたブロックを抜けると破棄されます。 auto指定子は