블로그는 귀차니즘

First Sensation
  • 공지
  • 지역로그
  • 태그
  • 방명록

STL Iterator 에서의 후위, 전위 연산 차이

Language 2008/02/26 13:48 귀차니스트
  새삼스럽게 적는 것 네요. 많은 분들이 알고 계실거라 생각하고 있지만 의외로 주위에 후위연산을 주로 사용하던 사람들은 이에 대한 차이를 모르는 경우가 많더군요. 그래서 생각 나는김에 한 번 포스팅 해봅니다.
  STL 컨테이너를 비롯하여 많은 Iterator 사용소스를 보면 후위( a++ )연산자를 사용하지 않고 전위 연산자를 주로 사용하는 것을 보실 수 있으실 겁니다. 그 것은 바로 효율성 면에서 차이가 발생하기 때문에 그렇습니다. 간단히 integer형 변수 같은 경우엔 전위 연산이나 후위 연산이나 선수를 제외한 성능에 대한 차이는 발생하지 않습니다.

Compile.cpp (Language : cpp)
  1. #include <iostream>
  2.  
  3. int main( int argc, char **argv )
  4. {
  5.     int a = 0;
  6.     ++a; 혹은 a++;
  7.     return 0;
  8. }

후위연산.cpp (Language : asm)
  1. 00401196    E8 65FEFFFF CALL TestPost.main
  2. 0040119B    83C4 0C  ADD ESP,0C
  3. 0040119E    8BF0        MOV ESI,EAX
  4. 004011A0    8975 D8  MOV DWORD PTR SS:[EBP-28],ESI
  5. 004011A3    397D E4  CMP DWORD PTR SS:[EBP-1C],EDI
  6. 004011A6    75 06      JNZ SHORT TestPost.004011AE
  7. 004011A8    56    PUSH ESI
  8. 004011A9    E8 9C010000 CALL TestPost.exit

전위연산.cpp (Language : asm)
  1. 00401196    E8 65FEFFFF CALL TestPost.main
  2. 0040119B    83C4 0C  ADD ESP,0C
  3. 0040119E    8BF0        MOV ESI,EAX
  4. 004011A0    8975 D8  MOV DWORD PTR SS:[EBP-28],ESI
  5. 004011A3    397D E4  CMP DWORD PTR SS:[EBP-1C],EDI
  6. 004011A6    75 06      JNZ SHORT TestPost.004011AE
  7. 004011A8    56    PUSH ESI
  8. 004011A9    E8 9C010000 CALL TestPost.exit

  위를 보시면 간단히 Compile.cpp를 전위연산과 후위연산을 적용하여 컴파일을 해보았습니다만 생성된 실행코드에서 차이점이 발견되지 않습니다. 결국 성능상의 차이가 없다는 말이 되겠죠? 물론 CPU 아키텍쳐상으로 깊게 들어가서 ++연산이 어떠한 명령어 중간에 사용 되었을 때, 파이프라이닝에 대한 성능차이가 발생할 수 있다고 생각을 하시는 분도 계시겠지만 여기서 그 부분 까지는 생각할 것이 아니라고 생각합니다.
  그런데 왜 STL Iterator 는 성능 차이가 발생할 수 있을까요? 답을 아시는 분은 다 알고 계시겠지만 Operator Overloading 이라는 문법때문에 생기는 문제입니다. 간단히 std::vector 클래스를 살펴보면 내부 클래스로 Iterator 클래스가 존재하고 그 안에 ++, -- 연산자에 대한 오버로딩 소스가 존재합니다.

vector (Language : cpp)
  1. const_iterator& operator++()
  2. {   // preincrement
  3.     ++_Myptr;
  4.     return (*this);
  5. }
  6.  
  7. const_iterator operator++(int)
  8. {   // postincrement
  9.     const_iterator _Tmp = *this;
  10.     ++*this;
  11.     return (_Tmp);
  12. }

  바로 위 소스죠. STL 벤더들 마다 구현이 약간씩 다르므로 꼭 이 것과 동일하다고 생각할 수는 없습니다. 하지만 일반적으로는 이러한 형태를 띄고 있죠. 그런데 ++ 연산자에 대하여 두 개의 오버로딩이 존재하죠?? 이 것은 전위, 후위 연산을 구별하기 위한 C++ 컴파일러의 한 가지 방법입니다. 인자에 아무것도 존재하지 않으면 전위연산, int 형 인자가 하나 전달되면 후위 연산이라고 정의되기 때문이죠.
  그런데 여기서 차이가 어떻게 생기냐?? 눈치 빠르신 분들은 코드를 먼저 보고 답을 알아내셨을지도 모르겠네요. 그 것은 객체 하나의 차이입니다. 보시다시피 전위연산은 _MyPtr을 하나 증가 시킨다음 그 에 해당하는 값을 바로 리턴하는데 반해 후위연산은 임시로 필요한 객체를 하나 생성하고 전위연산을 이용하여 증가시키는 작업 후 임시객체에 저장해놓았던 것을 리턴한다는 사실이죠. 결과적으로 보면 더 복잡해지는 것입니다. 그리고 Cost도 늘어나는셈이구요.
  사실 이 토픽은 스캇 마이어스저 Effective C++ 부분을 보면 자세히 나와있는 부분이기도 합니다. 이 것 말고도 많은 테크닉들이 존재하죠. 그 많은 테크닉을 하나하나 올바른 곳에 사용하는 방법을 아는 것이 중요하다고 생각이 듭니다.
크리에이티브 커먼즈 라이센스
Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-동일조건변경허락 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.

"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
2008/02/26 13:48 2008/02/26 13:48
TAG ++i, C++, i++, Iterator, STL, 전위연산, 후위연산
받은 트랙백이 없고, 댓글이 없습니다.

트랙백 주소 :: http://www.filewiki.net/tc/trackback/18

댓글을 달아 주세요

◀ 이전페이지 1 다음페이지 ▶

블로그 이미지
First Sensation 귀차니스트
rss
  • 관리자
  • 글쓰기

카테고리

  • 전체 (111)
    • Computer (3)
    • Language (14)
    • Reverse Engineering (1)
    • Algorithm (9)
    • TopCoder (3)
    • Library (2)
    • Programming (20)
    • Programming Tip (9)
    • PSP-Programming (10)
    • Program (5)
    • Small Talk (31)
    • Document (4)

최근에 올라온 글

  • Gradient에 대한 정리.
  • Gradient 작성중에 있습.... (3)
  • 게임&인터랙티브 애플리....
  • 한게임 자동테트리스 Ve.... (27)
  • Intel 64 And IA32 Arch.... (2)

최근에 달린 댓글

  • 관리자만 볼 수 있는 댓글입.... 비밀방문자 01/08
  • 글쎄요.. 프로그램이라는게.... 귀차니스트 01/08
  • 관리자만 볼 수 있는 댓글입.... 비밀방문자 01/07
  • 본문에 배포는 하지 않는다고.... 귀차니스트 01/07
  • 다운어덯게 받아요. difl 2008

달력

«   2009/01   »
일 월 화 수 목 금 토
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

링크

  • kkamagui 프로그래밍 세상.
  • 류광의 번역 이야기.
  • 서광열의 프로그래밍 언....
  • 준호씨의 블로그.
  • 최익필의 이름없는 블로그.
  • 위키는 귀차니즘.

최근에 받은 트랙백

  • 궁극의 예외처리. 이름없는 블로그 2008
  • Maximum sum. 티스토리 지점 2008

글 보관함

  • 2009/01 (1)
  • 2008/12 (1)
  • 2008/11 (4)
  • 2008/10 (2)
  • 2008/09 (3)

태그목록

  • Iterator
  • Linefeed
  • LZSS
  • 책
  • GUI
  • As 형 변환
  • Dialog
  • 개인정보유출
  • iterator_traits
  • 해로
  • 분양
  • 병렬
  • DP
  • ACM-ICPC
  • Gradient
  • i++
  • 쉘
  • Call By Value
  • 한국가상캠퍼스
  • 개발일지
  • Mouse Message
  • Logitech
  • System.Xml
  • 공백
  • Programming
  • ICPC
  • XQuared
  • 십자매
  • spirit
  • RCW

지역로그 : 태그 : 방명록 : 관리자 : 글쓰기
귀차니스트’s Blog is powered by Textcube 1.7.5 : Risoluto / Designed by DesignNia.net