C の register キーワード

Waqar Aslam 2023年10月12日
  1. C 言語のregisterキーワードの概要
  2. C 言語での Register キーワードの使用法
  3. C 言語でレジスタ変数のアドレスを取得する
  4. C のポインター変数で register キーワードを使用する
  5. C での register キーワードを使用したストレージ クラスの使用
  6. C プログラミング言語の register 変数のスコープ
C の register キーワード

この記事では、C プログラミング言語の register キーワードについて説明します。

C 言語のregisterキーワードの概要

C プログラム内のすべての変数は、それぞれのメモリ アドレスとともにメモリに保存されます。 ただし、register キーワードを変数と組み合わせて使用すると、コンパイラはメモリよりも CPU レジスタに変数を保存する可能性が高くなります。

ご存じないかもしれませんが、プロセッサには有限数の汎用レジスタがあり、データに対して算術演算または論理演算を実行する前に、すべての変数をそれぞれのレジスタにロードするのは中央処理装置 (CPU) の役割です。

レジスタはメモリよりもはるかに高速であり、CPU のアクセス タイマーはそれに応じて短くなります。

その結果、register キーワードを、プログラム全体で最も頻繁に発生する変数とペアにします。 register キーワードは、可能な限り短い時間で取得できるように、問題の変数をプロセッサ レジスタに格納する必要があることをコンパイラに伝えます。

ただし、この変数をメモリまたはプロセッサ レジスタに格納するかどうかは、コンパイラが決定します。

register キーワードをプログラムで使用できる複数のシナリオを見てみましょう。

C 言語での Register キーワードの使用法

以下は、C プログラミング言語で使用される register キーワードの簡単な例です。

#include <stdio.h>

int main() {
  register char a = 'S';
  register double b = 10;
  register int c = 8;
  printf("The value of register variable a: %c\n", a);
  printf("The value of register variable b: %f\n", b);
  printf("The value of register variable c: %d", c);
  return 0;
}

出力:

The value of register variable a: S
The value of register variable b: 10.000000
The value of register variable c: 8

C 言語でレジスタ変数のアドレスを取得する

register キーワードを変数とともに配置するとします。 その場合、コンパイラが変数を CPU レジスタではなくメモリに格納することを決定したとしても、単項アドレス演算子 & を使用して変数のアドレスにアクセスすることはできません。

これは心に留めておくべき重要な事実です。

アドレス演算子 & をレジスタ変数と組み合わせると、使用しているコンパイラが警告またはエラーを表示します。 受け取るメッセージは、どちらであるかによって異なります。

変数で register キーワードを使用すると、変数の値をメモリではなくプロセッサ レジスタに配置でき、プロセッサ レジスタにはアドレスがないためです。 例を挙げてみましょう。

#include <stdio.h>
int main() {
  register int registerVariable = 22;
  int* ptr = &registerVariable;
  printf("%d", *ptr);
  return 0;
}

出力:

main.c: In function ‘main’:
main.c:5:5: error: address of register variable ‘registerVariable’ requested
    5 |     int* ptr = &registerVariable;
      |     ^~~

C のポインター変数で register キーワードを使用する

register キーワードはポインターと共に使用できます。 メモリ位置のアドレスを持つことができます。

以下は、C プログラミング言語でポインタ変数とともに使用される register キーワードの例です。

#include <stdio.h>

int main() {
  int value = 15;
  register int* pointerVariable = &value;
  printf("The value of the pointer is: %d", *pointerVariable);
  return 0;
}

出力:

The value of the pointer is: 15

C での register キーワードを使用したストレージ クラスの使用

C プログラミング言語では、1つの変数に対してさまざまなストレージ クラス指定子を使用することはできません。 レジスタはストレージ クラスです。

したがって、このレジスタを staticauto、および extern と組み合わせて使用することはできません。

#include <stdio.h>

int main() {
  auto register int value = 15;
  printf("The value of the pointer is: %d", value);
  return 0;
}

出力:

main.c: In function ‘main’:
main.c:5:5: error: multiple storage classes in declaration specifiers
    5 |     auto register int value = 15;
      |     ^~~~

C プログラミング言語の register 変数のスコープ

register キーワードは、ローカル変数と組み合わせてのみ使用できます。 グローバル スコープを持つ変数でレジスタを使用することはできません。

#include <stdio.h>

register int value = 22;
int main() {
  printf("%d", value);
  return 0;
}

出力:

main.c:3:14: error: register name not specified for ‘value’
    3 | register int value = 22;
      |
著者: Waqar Aslam
Waqar Aslam avatar Waqar Aslam avatar

I am Waqar having 5+ years of software engineering experience. I have been in the industry as a javascript web and mobile developer for 3 years working with multiple frameworks such as nodejs, react js, react native, Ionic, and angular js. After which I Switched to flutter mobile development. I have 2 years of experience building android and ios apps with flutter. For the backend, I have experience with rest APIs, Aws, and firebase. I have also written articles related to problem-solving and best practices in C, C++, Javascript, C#, and power shell.

LinkedIn