【发布时间】:2016-03-16 04:27:14
【问题描述】:
我想了解堆栈上的变量是如何分配空间的。
这里是这个没有变量的 C 程序
main() { return 0; }
它的反汇编是
push ebp
mov ebp, esp
sub esp, 0c0h
main() {
int i = 10; }
这个程序的反汇编是
push ebp
mov ebp, esp
sub esp, 0cch
我正在初始化一个 INT 变量,其大小为 4 个字节。但是在上面的反汇编编译器中分配了12个字节(0cc-0c0)。
对于下面的程序
main() { long long int i = 10LL; }
反汇编是
push ebp
mov ebp, esp
sub esp, 0D0h
上面的反汇编编译器为long long int分配了16个字节(0D0 - 0C0),大小为8个字节。
为什么编译器要为 4 字节的 INT 分配 12 字节(额外分配 4 字节。应该是 8 字节或 16 字节对齐),而为 8 字节的 LONG LONG INT 分配 16 字节?
有人可以澄清一下吗?
谢谢。
【问题讨论】:
-
在这个网站上被询问了无数次...
-
@dwelch 这没什么用,除非你真的提供了链接。
-
链接太多,OP懒得看,应该先看。
-
@dwelch 我刚刚尝试进行搜索,但找不到任何解释编译器分配额外空间的原因。不是说这个问题不存在,但也不是那么容易找到。我承认,其中有很多是相关的。
-
Google 给定操作系统的“堆栈帧”。
标签: c visual-studio assembly stack