2017-01-27 4 views
0

저는 Vishal Kochhar가 우수 사례 인 article을 C++ 컴파일러에서 어떻게 구현하는지에 대한 기본적인 아이디어를 얻었습니다. 은 try/CATCH 구문은 함수에 나타날 때마다 기본적으로, 컴파일러는 다음과 같이 프롤로그/에필로그 코드를 생성합니다 : 질문은암시 적 예외 처리

push -1 
push offset new_handler 
mov eax, fs:[0] 
push eax ; old handler saved on the stack 
mov fs[0], esp 
... 
mov ecx, [ebp-0Ch] ; recover old handler 
mov fs[0], ecx 

을, 같은 물건은 컴파일러에 의해 삽입 된 이유는 무엇인가 겉으로보기에는 예외 처리와 관련이없는 함수에? 나는 확실하다. 소스 코드에 따르면, 몸에 try/catch 블록이 없다.

+3

때로는 범위를 벗어날 때 "자동"해제해야하는 관리되는 유형으로 인해 삽입 된 암시 적 try/catch 프레임이 있습니다. –

+0

C++ 코드와 생성 된 어셈블리 코드 사이에 iff 관계가 없습니다. 당신이보고있는 코드 패턴이 C++ 소스의 try/catch 구조의 지표가 아니라 암시적인 것인지 아닌지에 대한 가능성은 전적으로 가능합니다. 이것은 여러 개의 상위 수준 구조를 지원하는 데 사용할 수있는 패턴 일뿐입니다. –

+0

예외는 throw 지점과 catch 지점 사이의 호출 된 함수를 통과해야하고 (자동 저장 기간의 소멸자가있는 객체를 올바른 순서로 정리하는 등) 도중에 정리해야합니다. 개입하는 기능에서 무언가를하지 않으면 이런 일이 발생하는 실용적인 방법이 없습니다. – Peter

답변

1

"예외 처리와는 아무런 관련이없는"이 함수는 로컬 변수에서 finalisers/destructors를 실행 중일 수 있습니다. 객체의 파이널 라이저는 일반 리턴 또는 캐치되지 않은 예외에 관계없이 범위가 끝나는 즉시 실행되어야하므로 함수는 프롤로그에 예외 처리기를 설치하여 어떤 경우에도 finaliser가 호출되도록해야합니다.

struct Foo { 
    ~this() nothrow { 
     ; 
    }; 
}; 

int main() nothrow { 
    Foo x; 
    return 0; 
}; 
:

struct Foo { 
    ~this() { 
     ; 
    }; 
}; 

int main() { 
    Foo x; 
    return 0; 
}; 

는 아마도 스마트 컴파일러가 nothrow 함수 등의 머리말/에필로그를 생략 할 수있을 것이다 :

D의 간단한 예는이 동작을 트리거

하지만이 언어는 아닙니다.