内存分配意味着什么
What memory allocation does mean
考虑以下一行:
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;
}
相关文章:
- 这行代码在C++类中意味着什么
- 这对"With a stackless coroutine, only the top-level routine may be suspended."意味着什么
- @CPPFLAGS@在 Makefile.in 中意味着什么?
- 生成文件"relink"意味着什么?
- 从二进制流中读取时,将双精度变量的地址转换为 char* 意味着什么?
- 在这种情况下,"typename..."意味着什么?
- "in-situ without memory allocation" 字符串的愚蠢实现意味着什么?
- 使用typedef有什么用,它意味着什么
- GCC 的 -Wpsabi 选项究竟有什么作用?压制它意味着什么?
- 这在C++ "It does not own the underlying data, and so is cheap to copy or assign"中意味着什么
- 由于某种原因,我的代码中出现了 [json.exception.type_error.302]。我知道错误意味着什么,但我不知道哪里有故障
- 调用堆栈显示 SIGBUS,这意味着什么
- C++标准在[basic.scope.hiding]中"same scope"到底意味着什么?
- 评估对象的创建意味着什么?
- 当我们在 C++ 中说"initialize the object"时,它实际上意味着什么?
- C++这种结构"InterceptionKeyStroke &kstroke = * (InterceptionKeyStroke *) &stroke"意味着什么?
- 该语法在C 中意味着什么
- 链接标志对静态库意味着什么
- 由mpglib输出的"hip: Can't rewind stream by 74 bits"到底意味着什么?
- 这在 C# 中意味着什么以及如何使用它