如果我有以下代码:
-(int)number {
int i = 3;
return i;
}
我可以通过& i获得整数i的内存地址。 (比如在返回线的断点处暂停)
但是相应的程序集(ARM)很简单:
MOV R0, #3
需要内存(存储指令除外),那么i
如何拥有内存地址?
答案 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
未定义的错误,因为它已经完全优化了。