如果我有以下代码:
-(int)number {
int i = 3;
return i;
}
我可以通过 &i 得到整数 i 的内存地址。(比如说在返回线上的断点处暂停)
然而,相应的程序集(ARM)将很简单:
MOV R0, #3
没有地方需要内存(除了存储指令),那么怎么i
会有内存地址呢?
如果我有以下代码:
-(int)number {
int i = 3;
return i;
}
我可以通过 &i 得到整数 i 的内存地址。(比如说在返回线上的断点处暂停)
然而,相应的程序集(ARM)将很简单:
MOV R0, #3
没有地方需要内存(除了存储指令),那么怎么i
会有内存地址呢?
该代码可能不需要使用内存,但这并不意味着它不使用内存。编译器可以随心所欲地实现它。如果没有优化,这意味着变量可能都存储在内存中,无论它们是否需要。例如,考虑这个非常基本的程序:
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
未定义的错误,因为它已经被完全优化了。