2013-03-05 106 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是未定義的,因爲它已經完全優化。

相關問題