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