は、ここで私は(x86用)整列スタックポインタを維持するために16バイトのローカル・バッファを宣言gccがなぜローカル用に余分なスペースを割り当てることがあるのですか?
#include <stdio.h>
char func_with_ret()
{
return 1;
}
void func_1()
{
char buf[16];
func_with_ret();
}
void func_2()
{
char buf[16];
getchar();
}
int main()
{
func_1();
func_2();
}
- 私のコードです。
- 私は2つの関数 "func_1"、 "func_2"を書いていますが、それらはほぼ同じです - 16バイトのローカルバッファを割り当て、char戻り値とパラメータなしで関数を呼び出しますが、一方は自己定義で、もう一つはgetchar ()。
- 予期しない最適化動作を避けるため、gccパラメータ "-fno-stack-protector"(スタックにカナリアがないため)と "-O0"を使用してコンパイルします。
ここでは、func_1とfunc_2のgdbによる逆アセンブリコードを示します。 FUNC_1で
Dump of assembler code for function func_1:
0x08048427 <+0>: push ebp
0x08048428 <+1>: mov ebp,esp
0x0804842a <+3>: sub esp,0x10
0x0804842d <+6>: call 0x804841d <func_with_ret>
0x08048432 <+11>: leave
0x08048433 <+12>: ret
Dump of assembler code for function func_2:
0x08048434 <+0>: push ebp
0x08048435 <+1>: mov ebp,esp
0x08048437 <+3>: sub esp,0x18
0x0804843a <+6>: call 0x80482f0 <[email protected]>
0x0804843f <+11>: leave
0x08048440 <+12>: ret
、バッファが しかしfunc_2において、それは0x18の(24)バイトに割り当てられているが0x10(16)バイトに割り当てられている、なぜですか?
編集: は、バッファサイズが実際の両方で同じであることを把握し、それがどこから来るかわからないfunc_2で 奇妙な8バイトのスタックスペースがあります@Attie。
関連:http://stackoverflow.com/questions/9862017/stack-allocation-why-the-extra-space – rsp
はおそらくそれが実際その 'getchar関数()' 'を返すとは何かを持っています'func_with_ret()'は 'char'を返します。しかし、最終的に、なぜあなたは気にしますか? –
私は両方の場合[ここ](https://godbolt.org/g/SUkHqw)で16を取得します。あなたのコンパイラは何ですか? – Arash