Jerry는 말했다 : ... 결과는 더 이상 C ++이 아니지만 내 은유 는 분명히 C ++ 이라는 것 입니다. 프로그램은 다른 형식, 규칙 및 서면 스타일을 사용하기 때문에 약간 다른 방언 입니다.
비활성화하는 주요 이유는 다음과 같습니다.
이진 호환성
언어와 번역 경계를 넘어서는 것은 보편적으로 잘 정의되지 않았거나 정의되지 않았습니다. 프로그램이 정의 된 동작의 도메인 내에서 작동하도록하려면 모듈 종료점에서 예외를 격리해야합니다.
실행 가능한 크기
다음은 내가 작성한 예외없는 프로그램의 이진 크기이며 예외가 있거나없는 상태에서 빌드되었습니다.
예외없이 :
- 실행 파일 + 종속성 : 330
- 제거 된 최종 실행 파일 (릴리스 빌드) : 37
예외 :
- 실행 파일 + 종속성 : 380
- 최종 제거 된 실행 파일 (릴리스 빌드) : 44
알림 : 이것은 던지기 / 캐치가없는 라이브러리와 프로그램의 모음입니다. 컴파일러 플래그 는 C ++ 표준 라이브러리에서 예외를 활성화합니다. 따라서이 예에서 실제 세계의 비용은 19 % 이상입니다.
컴파일러 : apple gcc4.2 + llvm. MB 단위의 크기입니다.
속도
"제로 비용 예외"라는 용어에도 불구하고 아무 것도 던지지 않더라도 여전히 약간의 오버 헤드가 추가됩니다. 위의 경우 성능이 중요한 프로그램 (신호 처리, 생성, 프리젠 테이션, 변환, 대규모 데이터 세트 / 신호 포함)입니다. 이 디자인에서 예외는 필수 기능이 아니지만 성능은 매우 중요합니다.
프로그램 정확성
이상한 이유처럼 보입니다. 던지기가 옵션이 아닌 경우 프로그램이 올바르게 실행되도록 클라이언트가 인터페이스를 올바르게 사용하도록 클라이언트가 비교적 엄격하고 정확하며 테스트를 거친 프로그램을 작성해야합니다. 오류 코드를 확인하지 않으면 UB가 필요합니다). 결과? 구현 품질이 크게 향상되고 문제가 빠르게 해결됩니다.
간단
예외 처리 구현은 종종 최신 상태로 유지되지 않습니다. 또한 구현에는 많은 수의 종료 시퀀스가있을 수 있으므로 많은 복잡성이 추가됩니다. 매우 복잡한 프로그램이 클라이언트에 의해 처리되고 처리되는 소규모의 잘 정의되고 유형이 지정된 종료 전략 세트를 사용하는 경우 매우 복잡한 프로그램을 읽고 유지하는 것이 더 간단합니다. 다른 경우, 구현은 시간이 지남에 따라 더 많은 던지기를 구현하거나 종속성으로 인해 발생할 수 있습니다. 고객은 이러한 모든 출구를 쉽고 적절하게 방어 할 수 없습니다. 많은 라이브러리를 작성하고 업데이트하는데, 진화와 개선이 빈번합니다. 예외 종료 시퀀스 (대규모 코드베이스에서)와 모두 일치하도록 유지하는 것은 시간을 잘 활용하지 못하고 많은 소음과 부스러기를 추가 할 수 있습니다. 프로그램 정확성이 향상되고 더 많은 테스트로 인해
역사 / 기존 코드
어떤 경우에는 역사적 이유로 소개되지 않았습니다. 기존 코드베이스는이를 사용하지 않았으며, 프로그램을 변경하면 수년이 걸릴 수 있으며 규칙과 구현이 겹치므로 유지 관리가 실제로 추악하게 만듭니다.
단점
물론, 단점은 다른 라이브러리와의 비 호환성 (이진 포함) 및이 모델에 맞게 많은 양의 프로그램을 구현해야한다는 사실입니다.