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

Jon*_*an. 1 iphone assembly objective-c

如果我有以下代码:

-(int)number {
    int i = 3;
    return i;
}
Run Code Online (Sandbox Code Playgroud)

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

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

MOV R0, #3
Run Code Online (Sandbox Code Playgroud)

无处需要内存(存储指令除外),那么如何i获得内存地址?

ugh*_*fhw 7

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

int main() {
    int i = 0;
    return i;
}
Run Code Online (Sandbox Code Playgroud)

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

_main:
    sub   sp, sp, #4
    movw  r0, #0
    str   r0, [sp]
    add   sp, sp, #4
    bx    lr
Run Code Online (Sandbox Code Playgroud)

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

_main:
    mov   r0, #0
    bx    lr
Run Code Online (Sandbox Code Playgroud)

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