기본 콘텐츠로 건너뛰기

라벨이 dowhile인 게시물 표시

try { throw } catch {} & do { break } while (false) #2

rein님의 C/C++의 예외 모델 차이 포스팅에서 C와 C++ 예외 모델 차이, 나와 다른 견해에 대해 깔끔하게 잘 설명하셨다. rein님 포스팅을 보고 내 포스팅 에 덧글로 달까...라고 생각했지만 말도 길어지고 해서 트랙백납치!! 100년도 안 되는 삶을 살아오면서 실무에 setjmp/longjmp를 쓴 적은 단 한 번도 없다. 누구나 생각하듯 나 역시 'setjmp/longjmp는 미친 짓이야!'라고 밖에 설명할 길이 없다. (오로지 컴파일러나 커널/드라이버 만드는 사람이나 쓰는 system call이라 생각하고 있다!) 그러나 본인은 rein님과 달리 C++코드에 거침 없이 do-while(false)를 쓴다. 그것이 C++답지 않다는 것도 물론 알고 있다. 그것이 C++에서보다 좀더 신경써야할 것이 많다는 것도 알고 있다. 하지만 실무를 하면서 - 그것도 미칠 듯한 퍼포먼스를 내야할 Router나 기타 서버 프로그래밍을 하면서 try-catch는 내겐 너무 버겁다. 예외상황이 전체 프로그램에서 크게 차지하는 부분이 많지 않더라고 해도, 가끔씩 나는 장애와 그에 따라 발생하는 수많은 예외상황에 try-catch는 너무너무 무겁다. 결국 rein님한테 하고 싶은 소리는 저도 setjmp/longjmp는 쓰지 않아요. 업무 요건 상 한 번 예외상황이 발생하면 허천나게 발생해서 try-catch는 너무 무거워요. 결론은 업무요건에 맞춰 알아서 쓰자~* 원본 위치: http://purewell.egloos.com/3507734

try { throw } catch {} & do { break } while (false)

예외를 처리하기 위해 여러가지 방법이 있는데, C++에서 표준으로 제공하는 try-throw-catch가 있다. 그러나 이 방법은 exception을 처리하기 위해 갖가지 삽질을 내부적으로 하는 것으로 매우 느리다는게 잘 알려져 있다. 그래도 얼마나 느린지 알고 싶었다. 그래서 do {} while (false)와 비교해보기로 했다. #include <exception> #include <iostream> #include <sys/time.h> using namespace std; static size_t gTestCount(100000); typedef long long ts_t; ts_t getTimestamp(void) { static __thread struct timeval tv; gettimeofday(&tv, NULL); return 1000000LL * tv.tv_sec + tv.tv_usec; } inline void funcDOWHILE(void) { static __thread size_t i(0); do { ++i; if ( i%2 ) break; return; } while (false); ++i; return; } inline void funcEXCEPTION(void) { static __thread size_t i(0); static exception _e; try { ++i; if ( i%2 ) throw(exception()); } catch(const exception&) { ++i; } return; } int main(int argc, char* argv[]) { ts_t t1, t2, diff; t1 = getTimestamp(); ...