内存分配意味着什么

What memory allocation does mean

本文关键字:什么 意味着 分配 内存      更新时间:2023-10-16

考虑以下一行:

int v[100];

这行分配100*sizeof(int)内存字节。但是如果我们要查找这一行的反汇编,那么它后面就没有代码了。那么在没有机器指令的情况下执行内存分配吗?我困惑…

这取决于上下文,但您最有可能谈论的是堆栈分配内存/自动变量,如下所示:

int fn()
{
    int v[100];
    ...
}

如果你看一下fn的反汇编,你应该注意到在函数序言中,esp寄存器中减去了一些值。

例如,

sub esp, 190h

这是您正在寻找的分配。该变量存储在堆栈上,因此通过移动堆栈指针esp,您为它清除了空间。

在编译器中,局部变量分配被转换为alloca(或"堆栈分配"),这是假设变量没有"未使用和完全删除",通常通过在函数开始时从堆栈指针中减去所需的总大小,并在函数结束时添加(或以其他方式恢复堆栈指针)来完成。

这是上面描述的函数的"LLVM IR"(IR = Intermedia Representation):

define i32 @fn() #0 {
  %v = alloca [100 x i32], align 16
  ret i32 42
}

在x86-64汇编程序中,它变成:

fn:                                     # @fn
    pushq   %rbp
    movq    %rsp, %rbp
    subq    $272, %rsp              # imm = 0x110
    movl    $42, %eax
    addq    $272, %rsp              # imm = 0x110
    popq    %rbp
    retq

(不要问我为什么是272字节,而不是400 -我真的不知道!)

如果我们启用优化,使用-O2,它变成:

fn:                                     # @fn
    .cfi_startproc
    movl    $42, %eax
    retq

换句话说,堆栈分配完全消失了。

源代码:

int fn()
{
    int v[100];
    return 42;
}