コンテンツにスキップ

C言語/register

出典: フリー教科書『ウィキブックス(Wikibooks)』

register

[編集]

register キーワードの基本概念

[編集]

C言語におけるregisterは、変数宣言時に使用するキーワードで、コンパイラに対してその変数をできるだけCPUのレジスタに格納するよう提案するものです。レジスタはメインメモリよりも高速にアクセスできるため、頻繁に使用される変数のパフォーマンスを向上させる意図があります。

register の構文

[編集]

registerキーワードは変数宣言時に型の前に配置します。

register int counter;

register キーワードの利用例

[編集]

ループカウンタでの使用

[編集]
void process_array(int arr[], int size) {
    register int i;
    for (i = 0; i < size; i++) {
        arr[i] = arr[i] * 2;
    }
}

頻繁にアクセスされる変数

[編集]
int calculate_sum(int n) {
    register int sum = 0;
    register int i;
    
    for (i = 1; i <= n; i++) {
        sum += i;
    }
    
    return sum;
}

register の制約

[編集]

registerキーワードには重要な制約があります。

register int value = 10;
int *ptr = &value;  // エラー: registerキーワードが付いた変数のアドレスは取得できない

このコードはコンパイルエラーになります。なぜなら、レジスタに格納された変数はメモリアドレスを持たないためです。

register キーワードの現代的な意味

[編集]

C言語の規格が発展するにつれて、registerキーワードの意味も変化してきました。

C規格 register の扱い
C89/C90 レジスタへの格納を提案(強制ではない)
C99 同上、ただし最適化技術の進化により効果が薄れる
C11 同上、ほとんどのコンパイラは無視する
C17/C18 同上
C23 同上

最適化とregisterの関係

[編集]

現代のCコンパイラは高度な最適化技術を持っており、registerキーワードがなくても効率的なレジスタ割り当てを行います。

// コンパイラは自動的に以下のiをレジスタに割り当てることがある
void function() {
    int i;
    for (i = 0; i < 1000000; i++) {
        // 何らかの処理
    }
}

まとめ

[編集]

registerキーワードは変数をCPUレジスタに格納するよう提案するものですが、現代のコンパイラではその重要性は大幅に低下しています。現在のCプログラミングでは、以下のポイントを理解しておくことが重要です:

  1. 最新のコンパイラは自動的に適切な変数をレジスタに割り当てる
  2. registerキーワードは単なる提案であり、コンパイラは無視することがある
  3. register変数のアドレスは取得できない
  4. 低レベルなパフォーマンス最適化が必要な場合にのみ考慮する

コードの読みやすさと保守性を優先し、過度にregisterキーワードに依存しないことが推奨されます。