【问题标题】:Understanding space allocation for variables on stack了解堆栈上变量的空间分配
【发布时间】: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


【解决方案1】:

编译器可以随意分配额外的存储空间。 C 标准没有规定对堆栈分配的限制。

编辑:

我使用 ICC 编译器对 godbolt 进行了一些实验,ICC 编译器是唯一可以生成与您的示例类似的代码的编译器。对于我之前提到的主要内容的论点,我反驳了自己。我还尝试创建一些字符数组,发现堆栈总是以 16 个字节为增量分配。一个 1-16 字节的 char 数组都会导致 16 字节的分配。接下来的 17-32 将导致 32 字节分配等等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-04
    • 2020-10-03
    • 2013-03-26
    • 2012-12-26
    • 2011-06-16
    • 2019-10-03
    • 2010-11-09
    相关资源
    最近更新 更多