C++ 为什么编译器只为int保留0x10位?

C++ 为什么编译器只为int保留0x10位?,c++,assembly,x86,stack,C++,Assembly,X86,Stack,我有以下代码: #include <iostream> using namespace std; void f() { cout << "hello" << endl; } void f(int i) { cout << i << endl; } int main() { f(); f(0x123456); } 现在,堆栈中的保留空间是16位(0x10,在第8048739行),而int是(在我的机

我有以下代码:

#include <iostream>
using namespace std;

void f()
{
    cout << "hello" << endl;
}

void f(int i)
{
    cout << i << endl;
}

int main()
{
    f();
    f(0x123456);
}
现在,堆栈中的保留空间是16位(0x10,在第8048739行),而int是(在我的机器上)32位。这不可能是因为优化,因为数字0x123456不适合16位。那么为什么编译器没有保留足够的空间呢

我自己也不确定,但我可以尽力帮助
sub esp,0x10
不用于获取堆栈上int(32位)的保留空间。相反,前4条汇编指令仅仅是一个编译器优化,用于释放ebp寄存器以用作通用寄存器

涉及整数的实际程序集是
mov DWORD PTR[esp],0x123456

希望能有帮助。 Digvijay

我自己也不确定,但我可以尝试帮助
sub esp,0x10
不用于获取堆栈上int(32位)的保留空间。相反,前4条汇编指令仅仅是一个编译器优化,用于释放ebp寄存器以用作通用寄存器

涉及整数的实际程序集是
mov DWORD PTR[esp],0x123456

希望能有帮助。
Digvijay

所以有人指出它是0x10字节(不是位)。它是16字节,因为gcc保持x86的堆栈16字节对齐。从GCC手册:

-mstackrealign在入口处重新对齐堆栈。在英特尔x86上,-mstackreallign选项会生成另一个开场白和尾声,在必要时重新调整运行时堆栈。这支持混合 保持4字节堆栈对齐的传统代码与 保持16字节堆栈对齐以实现SSE兼容性。另见 属性force\u align\u arg\u指针,适用于单个函数

-mprefered stack boundary=num尝试使堆栈边界与提升为num字节的2边界对齐。如果 -未指定MPREFERED堆栈边界,默认值为4(16字节或128位)


所以有人指出它是0x10字节(不是位)。它是16字节,因为gcc保持x86的堆栈16字节对齐。从GCC手册:

-mstackrealign在入口处重新对齐堆栈。在英特尔x86上,-mstackreallign选项会生成另一个开场白和尾声,在必要时重新调整运行时堆栈。这支持混合 保持4字节堆栈对齐的传统代码与 保持16字节堆栈对齐以实现SSE兼容性。另见 属性force\u align\u arg\u指针,适用于单个函数

-mprefered stack boundary=num尝试使堆栈边界与提升为num字节的2边界对齐。如果 -未指定MPREFERED堆栈边界,默认值为4(16字节或128位)


0x10
字节不是位。@在这种情况下,内存太多了!您是否在启用优化的情况下编译?哪个编译器版本?@Leeor我想是的-我没有指定任何东西。我将很快发布没有优化的代码。@或者没有优化的代码是相同的。
0x10
字节不是位。@Mat在这种情况下,内存太多了!您是否在启用优化的情况下编译?哪个编译器版本?@Leeor我想是的-我没有指定任何东西。我将很快发布没有优化的代码。@Lee或者没有优化的代码是相同的。因此,如果
sub esp,0x10
与优化有关,我何时为int保留空间?因此从链接中,esp现在指向下一个可用的可用内存。现在文字“ox123456”实际上存储在代码段中。然后使用第6条汇编指令将其复制到内存中。因此,如果
子esp,0x10
与优化有关,我何时为int保留空间?因此,从链接中,esp现在指向下一个可用的可用内存。现在文字“ox123456”实际上存储在代码段中。然后使用第6条汇编指令将其复制到内存中。
 08048733 <main>:
 8048733:   55                      push   ebp
 8048734:   89 e5                   mov    ebp,esp
 8048736:   83 e4 f0                and    esp,0xfffffff0
 8048739:   83 ec 10                sub    esp,0x10
 804873c:   e8 9b ff ff ff          call   80486dc <_Z1fv>
 8048741:   c7 04 24 56 34 12 00    mov    DWORD PTR [esp],0x123456
 8048748:   e8 bb ff ff ff          call   8048708 <_Z1fi>
 804874d:   b8 00 00 00 00          mov    eax,0x0
 8048752:   c9                      leave  
 8048753:   c3                      ret