문제

스택 풀림으로 인해 예외 처리가 약간 비싸다고 사람들이 말하는 것을 들었습니다.

뭔가를 얻지 못했습니다. 예외를 던지거나 "return"을 사용하는지 여부에 관계없이 스택 풀림이 발생합니다.그렇다면 차이점은 어디에 있습니까?

예를 들어 처리할 수 없는 메모리 문제가 발생하는 경우 유일한 옵션은 문제를 처리하거나 알려야 하는 영역에 도달할 때까지 기능을 중지하는 것입니다.그렇다면 예외를 발생시키는 다른 옵션은 무엇입니까?

예외를 발생시키는 대신 "return"을 사용할 수 있지만 마찬가지입니다.스택 풀기는 스택 6개까지 되돌릴 수 있다는 것을 알고 있지만 반환 값과 "반환"을 결합하여 확인합니다.

설명을 환영합니다.

도움이 되었습니까?

해결책

리턴을 사용하면 스택은 무조건적으로 "풀림"으로, 단일 "RET"머신 코드 명령을 실행하는 것만 큼 개념적으로 간단 할 수 있습니다. 예외에 따라 스택 풀기는 적절한 예외 처리기를 검색해야합니다. 이는 훨씬 더 복잡한 작업입니다. 예외 경로에는 또한 예외 객체를 구성하고 복사하는 작업이 있으며 이는 사소하지 않을 수 있습니다.

다른 팁

스택 해제는 단순히 반환하는 것과 다릅니다.또한 스택의 각 하위 수준에서 오류 처리기(catch 블록)를 검색하는 작업도 포함됩니다.이것이 바로 프로세스를 어렵게 만드는 이유입니다.

그렇기 때문에 정말 예외적인 상황에만 예외를 사용해야 합니다.예외 처리에 대한 경고는 예외를 스택의 더 높은 위치에 데이터를 전달하는 방법으로만 보는 사람들을 위한 것입니다."영리한" 프로그래밍을 좋아하는 사람들.그들은 그것이 문제를 해결하는 영리한 방법이라고 생각하지만, 그 대신 예상하지 못했던 두 가지 새로운 문제를 만들어냅니다.

일반적으로 반환 코드보다는 예외(정말 예외적인 상황의 경우)를 사용하는 것이 가장 좋습니다. 이렇게 하면 코드를 더 쉽게 읽고 유지 관리할 수 있습니다.예를 들어, 읽고 유지하기가 더 쉬운 것은 무엇입니까?

void MyMethod()
{
    try
    {
        Method1(); 
        Method2();
        Method3();
    }
    catch(SomeException const & e) // edited per Mordachai's suggestion
    {
       // handle SomeException
    }
    catch(SomeOtherException const & e)
    {
       // handle SomeOtherException
    }
}

void MyMethod()
{
    int err;
    err = Method1();
    switch(err)
    {
        case SOMEERRORCODE:
             // handle some error code
             break;
        case SOMEOTHERERRORCODE:
             // handle some other error code
             break;          
    }
    err = Method2();
    switch(err)
    {
        case SOMEERRORCODE:
             // handle some error code
             break;
        case SOMEOTHERERRORCODE:
             // handle some other error code
             break;          
    }
    err = Method3();
    switch(err)
    {
        case SOMEERRORCODE:
             // handle some error code
             break;
        case SOMEOTHERERRORCODE:
             // handle some other error code
             break;          
    }
}

오류 처리 메커니즘의 속도는 중요하지 않습니다. 전반적인 프로그램 성능에 영향을 미치기에는 너무 드물게 실행되어야합니다. 특별한 이벤트).

사람들이 예외 처리에 대해 비싸다는 것에 대해 이야기하면 기능의 성능에 미치는 영향에 대해 이야기하고 있습니다. 예외를 제기하지 않고 해당 함수가 완료 될 때. 많은 컴파일러는이 오버 헤드를 거의 0으로 줄이지 만 사용 가능한 컴파일러 나 하드웨어가 예외를 잘 처리하지 않는 일부 플랫폼, 특히 게임 콘솔이 있습니다.

처음에 예외를 전달하는 데 필요한 인프라에 대한 "비용"이 적습니다. 이것은 많은 사람들이 그것을 피하고 RTTI를 완전히 비활성화하기로 선택한 충분히 중요했습니다. 요즘에는 C ++가 이미 너무 높은 수준이라면 문제가된다면 ;-)

예외의 전파와 스택-무기위의 관점에서 추가 비용이 있지만 (a) 어쨌든 스택을 풀어야하기 때문에 (실제로 비용이있는 곳은 아니지만), (b) 당신은 당신은 이미 추가 비용이 어쨌든 문제가되지 않는 예외 경로에 있습니다.

예외 처리 비용에 대해 불평하는 대부분의 사람들은 예전의 예전을 생각하고 있습니다.

예외 처리가 성능에 미치는 영향에 관심이 있다면 읽기 시작하기 가장 좋은 곳은 C ++ 성능에 대한 기술 보고서 (특히 5.4 장).

프로그램의 성능에 대해 걱정하기 전에 품질, 정확성 및 견고성에 집중하는 것이 좋습니다. 많은 사용자들은 종종 결함이있는 빠른 프로그램보다 느린 작업 프로그램을 선호합니다.

프로그램이 작동 한 후 프로파일 러를 실행하고 가장 많은 시간이 소비되는 위치를 알아보십시오. 내 겸손한 의견은 오류 처리가 덜 자주 발생하기 때문에 약간 더 오래 걸릴 수 있다는 것입니다.

대부분의 예외 처리 버전은 컴파일러가 범위와 같은 문제를 처리하는 데 도움이 되도록 약간의 추가 오버헤드를 추가합니다. 여기 설명이 있는 글입니다.우리가 말하는 오버헤드는 매우 작으며 걱정할 가치가 거의 없습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top