GCCの末尾最適化

GCCがちゃんと Tail Recursion(末尾再帰)の最適化をしてくれていることを、本日はじめて自分の目で確認。

% cat tr.c
unsinged int add(unsinged int s, unsigned int a)
{
    return (a == 0) ? s : add(++s, --a);
}

% gcc -S -o tr.s tr.c
% gcc -S -O -o tr.o.s tr.c

で、tr.s と tr.o.s を比較してみると一目瞭然*1。「GCCは末尾最適化やってるよー」ということはどこかで聞いたことがあるような記憶はあるが、これでちゃんと確信が持てた。やっぱり、Learning and thinking without programming is partial understanding なのだ。

で、末尾最適化の情報をすこし探ってみたら、Emacs Lisp は末尾最適化をしてくれないみたい。Lispがそれやらなくてどうすんだよー、と思う。深い再帰をするときにはくれぐれも注意。まあ、おいらはEmacs使わないから関係ないけど。

*1:末尾最適化をしていることは tr.o.s だけでも一発でわかるけどね