2014-01-22 3 views
0

test에서 c에 대한 명시 적 할당과 비교하여 test2의 add (a, b) 반환 값과 관련하여 발생하는 상황은 무엇입니까? 반환 값을 사용하여 변수에 즉시 할당

void test(int a,int b) { 
    int c=add(a,b); 
    return incr(c); 
} 
void test2(int a,int b) { 
    return incr(add(a,b)); 
} 

는 아마도 참고로 할당// JITs 이론적 동일한 JVM은 AVM2, 자바 스크립트 인터프리터 용 IE 바이트 코드의 구현에서의 값이다.

아마도 명명 된 값 (변수)과 명명되지 않은 값은 모두 스택의 상황 별 위치에 대한 격리 된 지침입니다. 즉, 반환 값을 다음 명령으로 슬쩍 돌리는 마법적인 최적화는 없습니다.

즉 에있는 incr 명령은 여전히 ​​incr 3rd value of the stack 또는 그와 비슷한 결과를 가져옵니다.

+4

최적화에 따라 차이가 없을 수 있습니다. 그것의 컴파일러 것. 이 두 가지 차이점은 C에 의해 정의되지 않았습니다. – chux

+6

컴파일러에서 생성 한 코드를 직접 확인하십시오 (빌드 릴리스). 당신은 그들이 똑같은 것을 볼 것입니다! 나는 Beginers 프로그래밍 수업에 대해 놀랍습니다. 읽기 쉽고 이해하기 쉬운 것이 아닌 비 감각적 인 최적화에 대해 이야기합니다. : O –

+0

명명 된 임시 변수가 비싸다고 생각합니까? 비용이 발생했다고 믿는 단위는 무엇이며, 그 비용은 왜 당신에게 중요한가? 저장 위치에 이름이 없거나 존재하지 않는다고 생각합니까? 'add'의 결과는 * 어딘가에 가야합니다 *; 그 위치에 이름을 지정하지 않으면 여전히 존재합니다. –

답변

1

대답은 "다릅니다"입니다. 사용중인 컴파일러와 컴파일러에서 사용하는 옵션 (최상의 디버깅 성능과 최상의 성능을 위해 컴파일).

최신 모드의 최적화 된 컴파일러는 변수 creturn 문에서 한 번만 사용된다는 것을 인식하고 스택 상단에 값을 그대로 두어 return이 될 수 있습니다.

디버깅 모드에서는 일반적으로 최적화가 해제되고이 값은 c이라는 실제 변수에 할당되어 스택 프레임의 슬롯을 차지합니다. 이렇게하면 리턴 라인이 실행되기 전에 그 라인 다음에 멈추고 값을 검사하여 그 라인에 할당 된 것을 볼 수 있습니다. 이것은 몇 사이클 더 소요되지만, 일반적으로 "고객"에게 제공되는 코드 나 컴파일러/디버거 작성자를 제외한 다른 사람에게는 일반적으로 중요하지 않은 성능 분석을 위해 사용하는 모드가 아니기 때문에.