C の register キーワード
-
C 言語の
register
キーワードの概要 -
C 言語での
Register
キーワードの使用法 - C 言語でレジスタ変数のアドレスを取得する
-
C のポインター変数で
register
キーワードを使用する -
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 = ®isterVariable;
printf("%d", *ptr);
return 0;
}
出力:
main.c: In function ‘main’:
main.c:5:5: error: address of register variable ‘registerVariable’ requested
5 | int* ptr = ®isterVariable;
| ^~~
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つの変数に対してさまざまなストレージ クラス指定子を使用することはできません。 レジスタはストレージ クラスです。
したがって、このレジスタを static
、auto
、および 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;
|
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