- 论坛徽章:
- 0
|
不过是一个 esp 减 XX 值的计算,和一般的局部变量分配过程是一样的。效率上没啥影响。
void foo(int i)
{
int s;
... ...
}
像上面这个变长数组,原理是很简单的
esp - i * sizeof(int) 就等于分配了变长数组空间。
但是,gcc 还要考虑 stack 边界对齐的问题。默认下是 16 bytes 边界对齐
上面的代码 gcc 处理为:
leaq 30(,%rdi,4), %rdi /* i * sizeof(int) */
andq $-16, %rdi
subq %rdi, %rsp
leaq 15(%rsp), %rax
andq $-16, %rax
-----------------------------------------------
leaq 30(,%rdi,4), %rdi
andq $-16, %rdi
这两句的结果是:如果 i = 0x02 则调整为 i = 0x08 + 0x0f + 0x0f & 0xF0 = 0x20
与 rsp 相减后
leaq 15(%rsp), %rax
andq $-16, %rax
再调整到下个 16 bytes 边界上。
[ 本帖最后由 mik 于 2009-6-19 00:01 编辑 ] |
|