1

如果我有以下代码:

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

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

然而,相应的程序集(ARM)将很简单:

MOV R0, #3

没有地方需要内存(除了存储指令),那么怎么i会有内存地址呢?

4

1 回答 1

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未定义的错误,因为它已经被完全优化了。

于 2013-03-06T03:06:54.727 回答