함수의 인라이닝이 인 경우 항상이 아닌 (예 : Closure Compiler 및 기타 컴파일러에서) 계속 읽습니다. 함수의 인라이닝을하지 않아도 될 때 예제를 제공해 주시겠습니까?인라인 할 때 안전하지 않은 경우는 언제입니까?
1
A
답변
2
많은 언어에서 함수를 인라인하면 프로그램의 컴파일 된 크기와 실행 시간에 영향을 줄 수 있지만 관찰 가능한 의미 론적 효과는 없습니다. 그러나 호출 스택 및/또는 로컬 변수 바인딩이 표시되는 언어에서는 그렇지 않습니다.
간단한 예로 Javscript의 로컬 변수 arguments
은 항상 현재 함수 호출에 대한 인수를 포함하는 배열과 유사한 객체를 참조합니다. 분명히, 그것이 발생한 함수가 인라인 되었다면, 그 의미가 바뀔 것이다. 인라이너는 본체가 arguments
을 참조하는 함수를 인라인하는 것을 거절하거나, 다른 이름으로 다른 로컬 변수를 만들고 참조를 대체하여 의미를 보존하는 방식으로 코드를 수정해야합니다.
또 다른 예는 eval
의 (권장되지 않는) 사용입니다. eval
에 전달 된 문자열의 이름 조회는 eval
을 호출하는 함수의 범위 내에서 수행됩니다. 예를 들어
inner = function(s) { var x = 4; return eval(s); }
outer = function(s) { var x = 3; return inner(s); }
outer("x+1")
여기
outer
의해 반환 된 값이
5
이다.
inner
이 인라인 된 경우 이름 충돌을 피하기 위해 로컬 변수
x
의 이름을 변경해야하므로
4
이 반환됩니다. (모두
inner
및
outer
가 인라인 된 경우, 값은 아마 다른 다시 뭔가 될 것입니다.) 일반적으로
의 내용을 알 수있는 쉬운 방법이 없기 때문에이 eval
를 호출하는 함수를 인라인 매우 어려울 것 인수는 eval
입니다.