2011-03-02 5 views
2

나는 그것이 아주 초보의 경우이 질문은 언어 무신론자이며, 사과 가정,하지만 우리는 (이 예에서는 PHP)이 함수가 호출 될 때함수의 반환 값은 어디에 저장됩니까?

function myFunc() { return 4; }

이제 일반적으로 결과가 사용됩니다이 있다고 표현식 또는 변수에 지정 될 수 있습니다. 그러나 변수에 할당되지 않은 경우 반환 값은 호출 될 때 "live"가 어디입니까? 현재 문장의 목적을 위해 그것을 메모리에 유지하는 내부 구조가 있는가? 그리고 그 문장이 실행되면 다시 제거한다. 그냥 같은 것을 할 경우

+2

특정 언어에 많은 영향을 미치기 때문에 (실제로는 동일한 언어의 구현에 따라 다를 수 있음) 실제로 언어에 구애받지 않습니다. –

+0

반환 값은 종종 호출 스택에 전달됩니다. 그러나 이것은 결코 언어 (구현, 정말로) - 진단 적이 지 않습니다. –

답변

1

(참고 : C++ 특정) 대부분의 컴파일러 것 할당 된 함수의 결과를 얻는 변수 사용자 Return Value Optimisation 저장 값. 예를 들어

:

int myInt = myFunc(); 

그래서 myFunc 새로운 변수를 생성하지 않고 myInt와 직접 작동 스택에 myFunc 전달에 의해 myInt 가변적이고 포인터의 원인이됩니다.

그렇지 않으면 반환 값을 스택에 배치하여 함수를 반환합니다.

.NET에서는 Name Return Value Optimization이라고 생각합니다.

다른 컴파일러는 비슷한 기능을 가지고있을 것입니다.

2

: 그런 다음 번호 4가 return 문이 생성됩니다

var foo = bar(); 
myFunc(); 
var wibble = baz(); 

를 한 후 즉시에 대한 참조가 아니기 때문에 삭제됩니다.

+0

그래, 우리가 myFunc() + ComplexFunction()과 같이 더 복잡한 문장을 가지고 있다고하자. - 그리고 우리는 ComplexFunction()이 평가하는데 오랜 시간이 걸리고, 전체 문장이 평가 될 때까지 myFunc()의 반환 값이 메모리 어딘가에 있는지, 그리고 그렇다면 거기에 이름이 있습니까? – persepolis

0

그래서 우리는 나는이 하나가 컴파일러에 따라 생각하고 register allocation scheme의 MYFUNC() + ComplexFunction (같은 더 복잡한 문)

있었다 말한다.

컴파일러는 myFunc()에 대한 결과를 레지스터에 저장 한 다음 점프하여 ComplexFunction()을 실행할 수 있습니다. ComplexFunction()을 입력하면 레지스터가 스택에 저장되고 복귀 할 때 복원됩니다.

관련 문제