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 だけでも一発でわかるけどね