2013-03-05 1 views
1

나는 다음과 같은 코드가있는 경우 :레지스터에 저장된 데이터에 메모리 주소가있는 이유는 무엇입니까?

-(int)number { 
    int i = 3; 
    return i; 
} 

내가 &을하고 난에 의해, 정수 난의 메모리 주소를 얻을 수 있습니다. 어떻게 어디에도

MOV R0, #3 

필요한 메모리는 (상기 명령을 저장하는 경우를 제외) : 그래서 해당 조립체 (ARM) 것 간단 그러나

(말 복귀 라인에 브레이크 포인트에서 일시 정지 상태) i에 메모리 주소가 있습니까?

+0

호기심. 주소는 무엇입니까? 프로그램의 맥락에서 유효한 주소입니까? 또한, 디버거가 디스 어셈블리를 표시합니까 아니면 별도의 도구를 통해 얻은 것입니까? –

답변

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이 정의되지 않았다고 오류가 발생했습니다.

관련 문제