はじめての C

[Learning GNU C]

9.4. extern

extern は その変数が すでに 外部の 関数 または ファイルに 存在することを 意味するので extern を つけて 変数を 宣言すると プログラムは 実際には それへの メモリを 用意 reserve しない。

開発中に ある変数を 全ての ファイルで つくりたい場合 1つの ファイルで 全体として globally 宣言する。 それは 関数には 含まず その変数の extern 宣言を ヘッダファイルに 追加する。

9.5. register

register という 記憶クラスは 頻繁に 使用し アクセスする 変数を コンパイラによって 効率化させる 手がかり hint として 使われる。 変数は 通常 メインメモリ normal memory (RAM) に 記憶され 必要に なると コンピュータの 処理装置 processor の あちらこちらに 渡される。 データの 送信速度は 相当 高速だが 改良を 加えることが できる。 ほとんど 全ての コンピュータ 処理装置は cpu 記憶回路 cpu register から なり 実際は 処理装置上の メモリスロットだ。 ここに 記憶された データは メインメモリから データを 取り出すという 付加 overhead (処置) を 免れる。 このメモリは メインメモリと 比べて 非常に 小さいのだが ほんの わずかな 変数のみを 記憶することが できる。 GCC は 常に アクセス数の 多い 変数が なにかを 考え 決めて 記憶回路 register を 使用する。 それは うまく 働くが けっして 完全では ない。 なぜなら GCC には そのプログラムの 目的は わからないからだ。 register という キーワードを 用いることで 効率化には なにが 必要かを GCC に 知らせることが できる。

cpu 記憶回路で 変数を 保持するのに ともなう 1つの 問題は ポインタが もてないことだ。 ポインタは メインメモリのみを 指し示すことが できる。 こうした 制限のため GCC では プログラムの中の ポインタを とる アドレスを もった 変数では キーワードの register は 無視される。

プログラムを つくり そこで cpu 記憶回路に 変数を 保持させようとすると 結果は OS が こうした要求を 無視するか 引き受けるか honour 次第と なる。