河野真治 @ 琉球大学情報工学です。

In article <m3znfl5383.fsf@maedapc.cc.tsukuba.ac.jp>, MAEDA Atusi <maeda@cc.tsukuba.ac.jp> writes
> これは分かるんですけれど,g_10(), g_20(), g_4()とかがたくさんできるん
> じゃないか(だったらインライン展開の方が良いんじゃないか)ということです.

まぁ、呼び出し側で展開するか呼び出され側で展開するかの差なわけですけどね。

> あちこちからg(10, x, y)のように特定の引数だけで呼ばれるということが,
> そんなにあるものかどうか.

自明な例だと、
     inline fd(struct handle hd) { return  hd.hoge->hage->fugo->fd; }
みたいな奴。で、これが、
    fd(hd0) = fd(hd0) + 3;
みたいな形で呼ばれるわけだな。(おっと左側には置けないが...)
この場合は、inline が有効なわけですが... だめな例をを考える
のは結構面白いかも。

specialize した関数を手で複数書くのは人間には危なすぎます。
変更したときに、他方を変更することを忘れることが多いので。
 # define で工夫した例をみたこともあるけど... どれだかは
忘れました。

Lisp では良く使われる技術なんですけどね。
   (defmacro hoge (a b c) ....)
して、
   (defun hoge1 (b c)  (hoge 1 b c))
   (defun hoge2 (b c)  (hoge 2 b c))
みたいな...

> あとは,specialize結果をちゃんと(同じインス
> タンスを呼ぶように)共有するのがそんなに簡単なのかどうか(色んなファイル
> から呼ばれてたり,とか).

そのあたりは色んな技術があるわけなんだけど... 何故、inline 
だけが使われているのかと言うと、呼び出し側だけ見れば良いから
なんだろうな。でも、最適化という観点から見れば、全体を見なけ
ればだめなのは当然なんですけどね。

inline でcodeが大きくなる欠点が実は無視できないのと、末端の
call の手間は実は小さいのとで、inline は、あまり有効でない
ってことなんでしょうね。

その一方で、nested function call とか indirect function call
ってのは、パフォーマンスに対する影響は結構あるんじゃないかっ
てのが僕の意見です。stack top を register にキャッシュするの
は有効な技術なので、単純に、必ずstackに触るcall/return する
のではだめなんじゃなかろうかってわけですね。

---
Shinji KONO @ Information Engineering, University of the Ryukyus, 
河野真治 @ 琉球大学工学部情報工学科,