为什么存储在寄存器中的数据有内存地址?

时间:2013-03-05 23:59:34

标签: iphone objective-c assembly

如果我有以下代码:

-(int)number {
    int i = 3;
    return i;
}

我可以通过& i获得整数i的内存地址。 (比如在返回线的断点处暂停)

但是相应的程序集(ARM)很简单:

MOV R0, #3

需要内存(存储指令除外),那么i如何拥有内存地址?

1 个答案:

答案 0 :(得分:7)

该代码可能不需要使用内存,但这并不意味着它不使用内存。编译器可以根据需要实现它。如果没有优化,这意味着变量可能都存储在内存中,无论它们是否需要。例如,考虑这个非常基本的程序:

int main() {
    int i = 0;
    return i;
}

禁用优化(默认情况下),Apple clang 4.0为我提供了以下程序集:

_main:
    sub   sp, sp, #4
    movw  r0, #0
    str   r0, [sp]
    add   sp, sp, #4
    bx    lr

启用优化后,我会得到一个更简单的程序:

_main:
    mov   r0, #0
    bx    lr

如您所见,未优化版本将0存储在内存中,但优化版本不存储。如果您在调试器中使用优化版本,则无法为您提供i的地址。我实际上遇到了i未定义的错误,因为它已经完全优化了。