새삼스럽게 적는 것 네요. 많은 분들이 알고 계실거라 생각하고 있지만 의외로 주위에 후위연산을 주로 사용하던 사람들은 이에 대한 차이를 모르는 경우가 많더군요. 그래서 생각 나는김에 한 번 포스팅 해봅니다.
STL 컨테이너를 비롯하여 많은 Iterator 사용소스를 보면 후위( a++ )연산자를 사용하지 않고 전위 연산자를 주로 사용하는 것을 보실 수 있으실 겁니다. 그 것은 바로 효율성 면에서 차이가 발생하기 때문에 그렇습니다. 간단히 integer형 변수 같은 경우엔 전위 연산이나 후위 연산이나 선수를 제외한 성능에 대한 차이는 발생하지 않습니다.
위를 보시면 간단히 Compile.cpp를 전위연산과 후위연산을 적용하여 컴파일을 해보았습니다만 생성된 실행코드에서 차이점이 발견되지 않습니다. 결국 성능상의 차이가 없다는 말이 되겠죠? 물론 CPU 아키텍쳐상으로 깊게 들어가서 ++연산이 어떠한 명령어 중간에 사용 되었을 때, 파이프라이닝에 대한 성능차이가 발생할 수 있다고 생각을 하시는 분도 계시겠지만 여기서 그 부분 까지는 생각할 것이 아니라고 생각합니다.
그런데 왜 STL Iterator 는 성능 차이가 발생할 수 있을까요? 답을 아시는 분은 다 알고 계시겠지만 Operator Overloading 이라는 문법때문에 생기는 문제입니다. 간단히 std::vector 클래스를 살펴보면 내부 클래스로 Iterator 클래스가 존재하고 그 안에 ++, -- 연산자에 대한 오버로딩 소스가 존재합니다.
바로 위 소스죠. STL 벤더들 마다 구현이 약간씩 다르므로 꼭 이 것과 동일하다고 생각할 수는 없습니다. 하지만 일반적으로는 이러한 형태를 띄고 있죠. 그런데 ++ 연산자에 대하여 두 개의 오버로딩이 존재하죠?? 이 것은 전위, 후위 연산을 구별하기 위한 C++ 컴파일러의 한 가지 방법입니다. 인자에 아무것도 존재하지 않으면 전위연산, int 형 인자가 하나 전달되면 후위 연산이라고 정의되기 때문이죠.
그런데 여기서 차이가 어떻게 생기냐?? 눈치 빠르신 분들은 코드를 먼저 보고 답을 알아내셨을지도 모르겠네요. 그 것은 객체 하나의 차이입니다. 보시다시피 전위연산은 _MyPtr을 하나 증가 시킨다음 그 에 해당하는 값을 바로 리턴하는데 반해 후위연산은 임시로 필요한 객체를 하나 생성하고 전위연산을 이용하여 증가시키는 작업 후 임시객체에 저장해놓았던 것을 리턴한다는 사실이죠. 결과적으로 보면 더 복잡해지는 것입니다. 그리고 Cost도 늘어나는셈이구요.
사실 이 토픽은 스캇 마이어스저 Effective C++ 부분을 보면 자세히 나와있는 부분이기도 합니다. 이 것 말고도 많은 테크닉들이 존재하죠. 그 많은 테크닉을 하나하나 올바른 곳에 사용하는 방법을 아는 것이 중요하다고 생각이 듭니다.
STL 컨테이너를 비롯하여 많은 Iterator 사용소스를 보면 후위( a++ )연산자를 사용하지 않고 전위 연산자를 주로 사용하는 것을 보실 수 있으실 겁니다. 그 것은 바로 효율성 면에서 차이가 발생하기 때문에 그렇습니다. 간단히 integer형 변수 같은 경우엔 전위 연산이나 후위 연산이나 선수를 제외한 성능에 대한 차이는 발생하지 않습니다.
위를 보시면 간단히 Compile.cpp를 전위연산과 후위연산을 적용하여 컴파일을 해보았습니다만 생성된 실행코드에서 차이점이 발견되지 않습니다. 결국 성능상의 차이가 없다는 말이 되겠죠? 물론 CPU 아키텍쳐상으로 깊게 들어가서 ++연산이 어떠한 명령어 중간에 사용 되었을 때, 파이프라이닝에 대한 성능차이가 발생할 수 있다고 생각을 하시는 분도 계시겠지만 여기서 그 부분 까지는 생각할 것이 아니라고 생각합니다.
그런데 왜 STL Iterator 는 성능 차이가 발생할 수 있을까요? 답을 아시는 분은 다 알고 계시겠지만 Operator Overloading 이라는 문법때문에 생기는 문제입니다. 간단히 std::vector 클래스를 살펴보면 내부 클래스로 Iterator 클래스가 존재하고 그 안에 ++, -- 연산자에 대한 오버로딩 소스가 존재합니다.
바로 위 소스죠. STL 벤더들 마다 구현이 약간씩 다르므로 꼭 이 것과 동일하다고 생각할 수는 없습니다. 하지만 일반적으로는 이러한 형태를 띄고 있죠. 그런데 ++ 연산자에 대하여 두 개의 오버로딩이 존재하죠?? 이 것은 전위, 후위 연산을 구별하기 위한 C++ 컴파일러의 한 가지 방법입니다. 인자에 아무것도 존재하지 않으면 전위연산, int 형 인자가 하나 전달되면 후위 연산이라고 정의되기 때문이죠.
그런데 여기서 차이가 어떻게 생기냐?? 눈치 빠르신 분들은 코드를 먼저 보고 답을 알아내셨을지도 모르겠네요. 그 것은 객체 하나의 차이입니다. 보시다시피 전위연산은 _MyPtr을 하나 증가 시킨다음 그 에 해당하는 값을 바로 리턴하는데 반해 후위연산은 임시로 필요한 객체를 하나 생성하고 전위연산을 이용하여 증가시키는 작업 후 임시객체에 저장해놓았던 것을 리턴한다는 사실이죠. 결과적으로 보면 더 복잡해지는 것입니다. 그리고 Cost도 늘어나는셈이구요.
사실 이 토픽은 스캇 마이어스저 Effective C++ 부분을 보면 자세히 나와있는 부분이기도 합니다. 이 것 말고도 많은 테크닉들이 존재하죠. 그 많은 테크닉을 하나하나 올바른 곳에 사용하는 방법을 아는 것이 중요하다고 생각이 듭니다.
"Language" 분류의 다른 글
| boost::spirit - Parser 라이브러리 (0) | 2008/04/23 |
| std::ostreambuf_iterator, std::istreambuf_iterator의 이유 (1) | 2008/04/16 |
| std::auto_ptr - Smart Pointer 이지만?? (1) | 2008/04/13 |
| C# Application - Main 에서 Try-Catch 오작동 해결하는 방법 (4) | 2008/04/07 |
| Boost 1.35 - 워크샵 뒤의 포스팅 (2) | 2008/04/03 |


댓글을 달아 주세요