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 が格納されますが、最適化されたバージョンでは格納されません。デバッガーで最適化されたバージョンを使用すると、 のアドレスを取得できませんii完全に最適化されていたため、実際には未定義のエラーが発生しました。

于 2013-03-06T03:06:54.727 に答える