기금넷 공식사이트 - 경제 뉴스 - 마이크로컴퓨터 원리 블록 중첩이 일치하지 않습니다.
마이크로컴퓨터 원리 블록 중첩이 일치하지 않습니다.
일부 프로그래머는 다른 함수 내에 함수를 정의하는 것을 "중첩 함수"라고 믿습니다. 그러나 실제로는 중첩된 함수가 아니며 어휘 범위로 처리됩니다. C에서는 컴파일러가 내부 함수의 올바른 메모리 위치에 도달하거나 찾을 수 없기 때문에 어휘 범위 지정은 효과가 없습니다.
C에서는 다른 함수 내에 함수를 정의할 수 없기 때문에 중첩 함수를 지원하지 않습니다. 함수 내부에서 함수를 선언할 수 있지만 중첩된 함수는 아닙니다.
중첩 함수 정의는 주변 블록의 지역 변수에 액세스할 수 없기 때문에 포함 모듈의 전역 변수에만 액세스할 수 있습니다. 이는 전역 변수가 디렉토리에서 조회될 필요가 없도록 수행됩니다. C와 마찬가지로 로컬과 전역(내장 함수 제외)이라는 두 개의 중첩된 범위가 있습니다. 따라서 중첩된 함수는 사용이 제한됩니다. C에서 중첩 함수를 사용하려고 하면 컴파일 타임 오류가 발생합니다.
출력:
컴파일 시간 오류: 'view'에 대한 정의되지 않은 참조
GNU C 컴파일러에 대한 확장을 사용하면 중첩 함수 선언이 허용됩니다. GCC 확장 아래에 중첩된 함수를 선언하려면 auto 키워드로 시작하거나 접두사를 붙여야 합니다.
그리고 gcc는 주로 Trampoline을 통해 함수 중첩 기능을 구현하는데 Trampoline이란 무엇입니까?
Trampoline은 실제로 스택에 존재하는 실행 가능한 코드 조각으로, 런타임에 의해 동적으로 생성되며 스택에서 이 코드를 실행하여 실제 대상 코드로 점프합니다.
트램폴린을 통해 함수 중첩을 구현해야 하는 이유는 컨테이너 함수의 지역 변수에 액세스할 수 있기 때문에 중첩 함수의 특성부터 시작해야 합니다.
이 중 오프셋은 중첩된 함수에서 직접 참조할 수 있는 컨테이너 함수의 변수입니다. 이는 달성하기 어렵지 않은 것 같습니다. 컨테이너 함수의 스택 변수는 sp 오프셋을 통해 쉽게 액세스할 수 있지만 고려해야 할 또 다른 상황이 있습니다. 즉, 중첩 함수는 컨테이너 함수에서 직접 호출할 수 있을 뿐만 아니라 함수 포인터를 통해 다른 함수에서도 간접적으로 호출할 수 있습니다. 이때 활성 스택 프레임 레이아웃은 sp 오프셋을 통해 액세스되는 것과 다릅니다. 변수의 위치에 따라 더 이상 컨테이너 함수에 있지 않으며 예상치 못한 결과가 발생합니다.
Trampoline은 컨테이너 함수의 스택에 Trampoline이 존재하고 접근하려는 컨테이너 함수를 기준으로 변수의 상대적인 위치가 고정되어 있기 때문에 이런 상황을 효과적으로 피할 수 있습니다. 호출되면 실행은 모두 스택의 Trampoline이므로 액세스되는 컨테이너 함수의 변수 위치는 항상 정확합니다. 그러나 이를 위해서는 중첩 함수가 호출될 때 컨테이너 함수가 종료될 수 없어야 합니다. 그렇지 않으면 스택의 Trampoline을 덮어쓰게 되어 예상치 못한 결과도 얻게 됩니다.