C에서 배후에서 예외가 작동하는 방식
소개:
예외에 대한 질문이 자주 발생합니다. 효율성을 위해. 이 문서에서는 실행 프로세스에 대한 포괄적인 이해를 제공하기 위해 C에서 예외의 복잡한 작동 방식을 살펴봅니다.
예외 처리 메커니즘:
예외는 반복 실행과 직접적으로 유사하지 않습니다. 보고; 여기에는 예외 테이블의 추가 계층이 포함됩니다. 예외가 발생하면 컴파일러는 이러한 테이블을 활용하여 핸들러를 찾고 적절한 핸들러에 도달할 때까지 스택을 해제하는 __cxa_throw에 대한 호출을 생성합니다.
예외 발생:
예외를 발생시키려면 다음과 같은 이유로 상당한 런타임 오버헤드가 필요합니다.
예외적인 반환:
반대로, 값을 반환하면 최소한의 오버헤드가 발생합니다. 예외는 예외적인 시나리오에만 드물게 활용해야 합니다.
예제 코드:
다음의 간단한 C 코드는 예외 처리를 위한 명령 생성을 보여줍니다.
<code class="cpp">class MyException { public: MyException() { } ~MyException() { } }; void my_throwing_function(bool throwit) { if (throwit) throw MyException(); } void another_function(); void log(unsigned count); void my_catching_function() { log(0); try { log(1); another_function(); log(2); } catch (const MyException& e) { log(3); } log(4); }</code>
생성된 어셈블리:
Linux에서 GCC를 사용하여 이 코드를 컴파일하면 다음 어셈블리 출력이 생성됩니다.
예외 발생:
_Z20my_throwing_functionb: ... movl , (%esp) call __cxa_allocate_exception ... movl %eax, (%esp) call __cxa_throw ...
예외 처리 표:
.section .gcc_except_table,"a",@progbits .LLSDATT9: ... .uleb128 .LEHB1-.LFB9 .uleb128 .LEHE1-.LEHB1 .uleb128 .L12-.LFB9 .uleb128 0x1 ...
결론:
예외에는 상당한 수준이 필요합니다. 처리 및 해제에 대한 오버헤드가 발생하며 반환 값은 최소한의 비용이 발생합니다. 예외는 예외적인 시나리오에 가장 적합하지만 성능 저하를 방지하려면 신중하게 사용해야 합니다.
위 내용은 C에서 예외는 내부적으로 어떻게 작동합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!