次のコードがある場合:
-(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
完全に最適化されていたため、実際には未定義のエラーが発生しました。