allocaの謎解決

allocaってローカル変数の配置をどうするのか謎に思っていた。


例えば以下のようなコードがあるとき

void
testfunc(int sz)
{
  int a;
  int b;
  int c;
  void* vp = alloca(sz);
  int d;
  int e;
}

&a : -4(%ebp)
&b : -8(%ebp)
&c : -12(%ebp)
&vp: -16(%ebp)
alloca(sz) : -???(%ebp)
&d : ???
&e : ???
とかなってしまうのではないかと。(x86でスタックが下に伸びるのを想定)

しかしよくよく考えてみると、コンパイラコンパイル時に既に変数の位置を確定するので、
&a : -4(%ebp)
&b : -8(%ebp)
&c : -12(%ebp)
&vp: -16(%ebp)
&d : -20(%ebp)
&e : -24(%ebp)
となって、実行時にローカル領域の下限を指しているesp=-28(%ebp)szをvpに代入してsz分(+ヘッダ分)ずらせばいいだけなのであった。