boost outcome은 예외상황일때는 더 빨라도 정상상황에서 zero cost가 아닌데
그럼 어쨌든 trade off 아닌가?
댓글 20
트레이드오프이긴 하지만, 예외인 상황이 은근 많이 일어날 수도 있는 상황에서는 기존 익셉션은 쓰기 힘들다고 봄. 메모리 관리가 개빡센 임베디드라던가 비디오 게임 개발 환경이라던가... 게다가 익셉션 쓰면은 통제 밖의 어셈블리 코드가 확 늘어날 수도 있고.
개인적으로 익셉션 말고 다른 걸 쓰는 건 에러 핸들링의 코드 및 행동 자체를 완전히 프로그래머의 통제하에 놓게 하고 싶어하는 것 땜에 쓰는거라고도 생각함.
노이ㄴ(liliilli)2019-10-20 22:08
답글
예외가 많이일어나는데 예외를 안쓸수가있음? 먼가 이상한데 말이
익명(106.102)2019-10-20 23:31
답글
저어가 여기서 말하는 예외라는게, 일단은 복구 가능한 에러를 말하는건데 기존 익셉션 대신에 대체안을 써서 예외상황을 컨트롤하겠다는거임.
노이ㄴ(liliilli)2019-10-20 23:42
답글
예를들어 어케됨
익명(106.102)2019-10-20 23:43
답글
만약에 어떤 자주 쓰는 메모리 풀에 대해 함수 안에서 여러가지 작업을 한 뒤에 메모리 할당을 하고 싶은데 꽉 차서 에러 상황이 일어난다고 하면, 이걸 throw 로 넘겨서 바깥에서 캐치해서 사용 안하는 아이템을 비우고 다시 할당 시도하냐, 아니면 다른 대책안을 써서 하느냐 인데..
우선 내가 try/catch 에 대해서 아는 바로는, throw 가 되면 스택을 되돌려서 어디 지점에서 캐치를 하게 해야할지를 런타임에 파악한다음 (대개 테이블 형태로) 에러를 처리하게 하고 있음. 물론 throw 안되면 윗 글처럼 비용은 없지만 위와 같은 짓을 에러가 날 때마다 해야한다하면 비용은 커진다고 봄. (물론 이건 ABI 형태마다 다 달라서 플랫폼, 컴파일러마다 try/catch 를 처리하는 방법은 다 다름)
노이ㄴ(liliilli)2019-10-21 00:02
답글
대책안은 if문같은거로 거르는거? 근데 if문으로 못거를거같으니까 예외를쓰는게 아닌가
익명(106.102)2019-10-21 00:03
답글
좆밥이라 트라이캐치외의 대책안이 뭐 말하는지 모르겠넹
익명(106.102)2019-10-21 00:03
답글
그래서 그냥 그럴바에야 리턴에 에러 코드를 넣어서 리턴하게 하던가, 아니면 boost::outcome 같이 원래 리턴형은 `요건`데 함수 안에서 에러 예외가 일어났을 때의 에러 코드 혹은 복잡한 정보같이 리턴하고 싶을 때 쓰는 에러 핸들링 라이브러리로 바꿔서 이걸로 핸들링을 하게 하던가 하는거임. 물론 요것들은 C++ 에러 핸들링 처리 사양이랑 별 상관 없어서 알아서 잘 짜서 핸들링하게 해줘야함... boost::outcome 이나 expected 같이 잘 짜면 에러 처리시에 try/catch 보다는 많이 빠름.
근데 예외가 일어난다는거 자체가 try catch 외엔 못잡는거아님? 이부분 어디서찾아보냐...
익명(106.102)2019-10-21 00:12
답글
예외가 일어나는건 코드 로직상에 뭔가 동작이 되어야 하는데 말거나 실패해서, 그걸 프로그래머가 로직상으로 throw 써서 넘기면 try/catch 예외 에러 핸들링이 되는거고, 그게 아니라 다른 방법으로 코드를 짜서 리턴값으로 에러 코드를 넘겨주던가 하면 그것도 일종의 예외 에러 핸들링이 됨.
노이ㄴ(liliilli)2019-10-21 00:13
답글
boost outcome 잠깐 찾아봤는데 것도 결국 트라이캐치아님?
익명(106.102)2019-10-21 00:16
답글
아님... 얘는 try catch 을 대체할려고 만든 라이브러리라서 트라이캐치 안씀. 아 근데 위에서 잘못 말한게 있는데, 예외는 에러랑 다름. 그래서 여기서 말하고자 하는건 대개 예외 상황의 핸들링을 try/catch 안쓰고 하고자 하는거...
노이ㄴ(202.231)2019-10-21 00:25
답글
예외가 내부적으로 어케발생하는지 정확히몰라서 try catch 외의 방법을 모르겠네...검색해봐도 try catch 얘기만 나오는데 볼만한 글 없음?
익명(106.102)2019-10-21 00:31
답글
그냥 예외 던지는것도 프로그래머들이 예외를 try/catch 로 던지게끔 하는 코드를 짜서, 그렇게 예외가 던져지는거에요. 내부적으로 어케 발생한다기 보다는, 이것도 그냥 프로그래밍적 방법론 중 하나임. 물론 그 이후에 루프 언롤링이랑 코드 블로팅 / 비결정적 처리 시간 / RTTI 사용 같은 디메릿땜에, 다른 방법을 사용해서 try/catch 을 대신하는거임....
노이ㄴ(liliilli)2019-10-21 08:15
vector.at()한다음 캐치하는거 / 먼저 길이랑 비교하고 필요시 예외처리, 그 다음 vector[]하는거 이렇게 구분해보면 되지않을까
휘발성(reduxx)2019-10-21 01:43
답글
흠 근데 if같은거로 못잡는 예외는 모르겠네 boost outcome을 찾아보적은 없어서
휘발성(reduxx)2019-10-21 01:46
답글
그럼 이미 예외를 예측한것아닌가
익명(106.102)2019-10-21 02:10
답글
boost::outcome 의 result 말고 outcome 쪽은 일반 라이브러리에서 throw 하는 예외 받아서 자기걸로 만들 수 있음.
트레이드오프이긴 하지만, 예외인 상황이 은근 많이 일어날 수도 있는 상황에서는 기존 익셉션은 쓰기 힘들다고 봄. 메모리 관리가 개빡센 임베디드라던가 비디오 게임 개발 환경이라던가... 게다가 익셉션 쓰면은 통제 밖의 어셈블리 코드가 확 늘어날 수도 있고. 개인적으로 익셉션 말고 다른 걸 쓰는 건 에러 핸들링의 코드 및 행동 자체를 완전히 프로그래머의 통제하에 놓게 하고 싶어하는 것 땜에 쓰는거라고도 생각함.
예외가 많이일어나는데 예외를 안쓸수가있음? 먼가 이상한데 말이
저어가 여기서 말하는 예외라는게, 일단은 복구 가능한 에러를 말하는건데 기존 익셉션 대신에 대체안을 써서 예외상황을 컨트롤하겠다는거임.
예를들어 어케됨
만약에 어떤 자주 쓰는 메모리 풀에 대해 함수 안에서 여러가지 작업을 한 뒤에 메모리 할당을 하고 싶은데 꽉 차서 에러 상황이 일어난다고 하면, 이걸 throw 로 넘겨서 바깥에서 캐치해서 사용 안하는 아이템을 비우고 다시 할당 시도하냐, 아니면 다른 대책안을 써서 하느냐 인데.. 우선 내가 try/catch 에 대해서 아는 바로는, throw 가 되면 스택을 되돌려서 어디 지점에서 캐치를 하게 해야할지를 런타임에 파악한다음 (대개 테이블 형태로) 에러를 처리하게 하고 있음. 물론 throw 안되면 윗 글처럼 비용은 없지만 위와 같은 짓을 에러가 날 때마다 해야한다하면 비용은 커진다고 봄. (물론 이건 ABI 형태마다 다 달라서 플랫폼, 컴파일러마다 try/catch 를 처리하는 방법은 다 다름)
대책안은 if문같은거로 거르는거? 근데 if문으로 못거를거같으니까 예외를쓰는게 아닌가
좆밥이라 트라이캐치외의 대책안이 뭐 말하는지 모르겠넹
그래서 그냥 그럴바에야 리턴에 에러 코드를 넣어서 리턴하게 하던가, 아니면 boost::outcome 같이 원래 리턴형은 `요건`데 함수 안에서 에러 예외가 일어났을 때의 에러 코드 혹은 복잡한 정보같이 리턴하고 싶을 때 쓰는 에러 핸들링 라이브러리로 바꿔서 이걸로 핸들링을 하게 하던가 하는거임. 물론 요것들은 C++ 에러 핸들링 처리 사양이랑 별 상관 없어서 알아서 잘 짜서 핸들링하게 해줘야함... boost::outcome 이나 expected 같이 잘 짜면 에러 처리시에 try/catch 보다는 많이 빠름.
음...못알아 들었다, 나머진 검색해봄
사실 try/catch 가 이러쿵저러쿵 안했다면은 2018년이나 되서도 C++ SG14 (성능충) 그룹에서 throw 좀 어떻게 해야한다 새로 쓰자 제안 나오고 막 이러진 않았을거라 생각함...
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p0709r0.pdf
근데 예외가 일어난다는거 자체가 try catch 외엔 못잡는거아님? 이부분 어디서찾아보냐...
예외가 일어나는건 코드 로직상에 뭔가 동작이 되어야 하는데 말거나 실패해서, 그걸 프로그래머가 로직상으로 throw 써서 넘기면 try/catch 예외 에러 핸들링이 되는거고, 그게 아니라 다른 방법으로 코드를 짜서 리턴값으로 에러 코드를 넘겨주던가 하면 그것도 일종의 예외 에러 핸들링이 됨.
boost outcome 잠깐 찾아봤는데 것도 결국 트라이캐치아님?
아님... 얘는 try catch 을 대체할려고 만든 라이브러리라서 트라이캐치 안씀. 아 근데 위에서 잘못 말한게 있는데, 예외는 에러랑 다름. 그래서 여기서 말하고자 하는건 대개 예외 상황의 핸들링을 try/catch 안쓰고 하고자 하는거...
예외가 내부적으로 어케발생하는지 정확히몰라서 try catch 외의 방법을 모르겠네...검색해봐도 try catch 얘기만 나오는데 볼만한 글 없음?
그냥 예외 던지는것도 프로그래머들이 예외를 try/catch 로 던지게끔 하는 코드를 짜서, 그렇게 예외가 던져지는거에요. 내부적으로 어케 발생한다기 보다는, 이것도 그냥 프로그래밍적 방법론 중 하나임. 물론 그 이후에 루프 언롤링이랑 코드 블로팅 / 비결정적 처리 시간 / RTTI 사용 같은 디메릿땜에, 다른 방법을 사용해서 try/catch 을 대신하는거임....
vector.at()한다음 캐치하는거 / 먼저 길이랑 비교하고 필요시 예외처리, 그 다음 vector[]하는거 이렇게 구분해보면 되지않을까
흠 근데 if같은거로 못잡는 예외는 모르겠네 boost outcome을 찾아보적은 없어서
그럼 이미 예외를 예측한것아닌가
boost::outcome 의 result 말고 outcome 쪽은 일반 라이브러리에서 throw 하는 예외 받아서 자기걸로 만들 수 있음.