2013-03-05 84 views
1

如果我有以下代码:为什么存储在寄存器中的数据有内存地址?

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

我可以得到整数i的内存地址,通过做&我。 (暂停时发言权断点上的返回线)

然而相应的组件(ARM)将简单为:

MOV R0, #3 

无处是所需的内存(除了以存储指令),所以如何i有一个内存地址?

+0

好奇。地址是什么?在程序的上下文中它是一个有效的地址吗?另外,调试器是否显示反汇编或通过单独的工具获取? – 2013-03-06 01:28:26

回答

7

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

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

随着优化禁用(这是默认设置),苹果铛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是未定义的,因为它已经完全优化。

相关问题