registerとは
エンジニアくん今回は register いくよ。ちょっと地味だけど、知っておくと“分かってる感”出るやつだね



名前からして速そうですね…!
register は、変数をできるだけCPUのレジスタに配置してほしい、という意図をコンパイラに伝えるキーワードです。
レジスタとは、CPU内部にある非常に高速な記憶領域のことです。
通常のメモリ(RAM)よりも高速にアクセスできるため、昔のC言語では処理速度の向上を目的として使われていました。
void func(void)
{
register int i;
for (i = 0; i < 100; i++) {
/* 繰り返し処理 */
}
}この例では、ループ変数 i をできるだけレジスタに置いてほしい、という意図を表しています。
ただし、register はあくまでコンパイラへのヒントであり、必ずレジスタに配置されるわけではありません。
C言語文法解説シリーズ
本記事は「C言語文法解説シリーズ」の1つです。
C言語の文法を、組み込み開発の視点も交えて解説しています。
C言語文法解説シリーズ一覧はこちら


なぜ昔はregisterが使われていたのか



昔のコンパイラは、今ほど賢くなかったんだよね
現在のコンパイラは最適化が非常に高度ですが、昔はどの変数をレジスタに置くべきかを十分に判断できない場合がありました。
そのため、開発者が
- よく使う変数(ループカウンタなど)
- アクセス頻度の高い変数
に register を付けることで、性能向上を狙っていました。
現在のC言語でregisterは使うべきか
結論から言うと、現在のC言語ではほとんど使われません。
理由はシンプルで、コンパイラが自動で最適化してくれるからです。
エンジニアくん「むしろ人間が指示する方がズレることもある」
そのため、現代の開発では
- コンパイラの最適化(-O2 など)
- アルゴリズム改善
- メモリアクセスの削減
といった方法で性能を改善するのが基本です。
register を使っても、ほとんどの場合は効果がありません。
registerの注意点(重要)
register を付けた変数には、アドレス演算子 & を使うことができません。
void func(void)
{
register int value = 10; int *p = &value; /* エラー */
}


レジスタって“メモリ上にあるとは限らない”からね
レジスタに配置される変数は、通常のメモリ上に存在しない可能性があります。
そのため、「アドレス」という概念が成立せず、& を使うことができません。
👉 ポインタで扱う可能性がある変数には、register は付けないようにしましょう。
組み込み開発でregisterは使う?
組み込み開発でも、現在は register を使う機会はかなり少ないです。
エンジニアくん「“レジスタ”って単語は出てくるけど、意味が違うから注意ね」
ここで言うCPUレジスタと、組み込みで扱う
- メモリマップドレジスタ(ハードウェアレジスタ)
は別物です。
組み込み開発では、以下のような観点の方が重要になります。
- volatile(最適化抑制)
- メモリアクセスの制御
- 割り込みとの整合性
register による最適化は、基本的にコンパイラに任せるのが一般的です。
registerのまとめ
register は、変数をレジスタに配置してほしいことをコンパイラに伝えるキーワードです。
昔は性能向上のために使われていましたが、現在のコンパイラでは自動最適化が行われるため、使われる機会はほとんどありません。
また、register を付けた変数はアドレスを取得できないという制約があります。
現代のC言語では、積極的に使うものというよりも、古いコードを読むために知っておくべきキーワードと考えるのがよいでしょう。
この記事が参考になった方へ
関数を含むC言語の基本文法をこちらの記事で整理しています。


技術に関するご相談・開発・自動化ツール作成・記事執筆などのご依頼も承っています。
小さなご相談からでもお気軽にご連絡ください。









コメント