スタックフレームは

末尾再帰を考えると、

+-------+
| local |
+-------+
| local |
+-------+
|  arg  |
+-------+
|  arg  |
+-------+
|retaddr|
+-------+
|  fp   |
+-------+

このほうがいいんじゃないか、と思ったんだけど、どうなんだろうか。

+-------+
| local |
+-------+
| local |
+-------+
| fp    |
+-------+
|retaddr|
+-------+
|  arg  |
+-------+
|  arg  |
+-------+

こういう構造になってる理由は…push、callを直接使えるから…なんだけど、GCCの出したコード見てると、

  • サイズ最適化しないと、引数pushとか使ってくれない
  • スタックフレームの削除と、引数積んだのを戻す処理が別にある

ってなってんだよな…
だとしたら、末尾再帰やりやすい分、上のほうがいいんじゃ。