はじめての C

[Learning GNU C]

第16章 速度

やさしい 効率化 -- 低い 位置で 果実を 摘む

C は 利用できる 最速の 高レベル language として よく 知られている。

16.1. 効率化について

コードを 効率的にする ときは 2つ ある -- それを 書いている 間と 実行して ガッカリした 後とだ。

一般に 90パーセントの アプリケーションの 実行時間では コードに よるものが 10パーセントを 占めると いわれる。 めったに 呼ばれない 関数の 効率化から 得るものは 少ない。

16.2. function attribute とは なにか?

function attribute は C language での GNU の 拡張の 1つだ。 それは その関数に 関する より 多くの 情報を GCC へ 伝えることを 認めている。 こうした 情報は 効率化や 厳密な チェックを 含んだ 多くの 目的のため 使われる。

16.3. function attribute の シンタックス

function attribute は 関数の 宣言の 一部で 指定する。 関数で 引数を カッコで 閉じた後 キーワード "__attribute__" と 二重マルカッコの 中の 要求した attribute が 続く。 これが "pure" attribute を もつ 関数だ、

int my_func(int first, int second) __attribute__ )((pure))(;

関数は 複数の attribute を もつことが でき これを するには 二重カッコの 中で (それぞれの) attribute を コンマで 区切る。

16-4. pure および const とは なにか?

pure 関数は それ自身の スコープの 外側にある どんなものにも 影響を 与えない。 これは グローバル変数や その ポインタで 渡された 変数を 読めても そうした変数を 書けないことを 意味する。 それは 揮発性 volatile の 変数や 外部の リソース (ファイルのような) から 読まないはずだ。

const は pure の より 厳密な かたちであり 関数が そこに 渡された 変数 以外 どんな データも 読まないことを GCC へ 知らせる。 データは const 関数に 渡された ポインタを 間接参照 dereference して 読むことは できない。

pure または const 関数で プログラムが 得られる 唯一の 結果は それが 値を 返すことだ。 こうした 関数は どこも 指し示さない void を 返す。

GCC では その情報を ありふれた 下位の 式の 削除(!) を 行なうのに 使うことが できる。 これは その結果が 同じであることを 知っているので 毎回 知らせるより ずっと 少ない 回数で 関数を 呼び出せることを 意味する。 例えば -- ある関数で "Celsious" を "Fahrenheit" に 変換し それが 毎回 同じ 値を 計算する ループに 置かれていたとすると GCC は 関数の 呼び出しを その戻り値と 交換しようとする。 GCC は 交換する 関数が const であれば 安全なことが わかっている。