프로그래밍 일반 2015. 5. 20. 18:02

컨테이너 순환문에서는 전위 증가 연산자를 사용하자

링크 : 어셈블리 기본


int i = 0;

int iPrefix = ++i; // 전위연산

int iPostfix = i++; // 후위연산


해당 코드의 결과는 프로그래머라면 누구나 알 수 있을 것이다.


그런데 두 연산자는 속도의 차이가 있을까?


필자는 전위 연산자가 더 빠르다고 배웠기 때문에 습관적으로 전위 연산자를 사용하고 있었는데 정말로 그런지 어셈코드를 확인해 보기로 했다.





코드를 보면 알 수 있지만 대입할 때 연산자 구현 차이[각주:1]만 있을 뿐 속도차이는 없다는 것을 알 수 있다.


그렇다면 객체에서는 어떨까?




객체의 경우 전위 연산자 처리가 훨씬 단순하다는 사실을 알 수 있다. 단지 스택 메모리를 추출 후 서브루틴으로 분기한다.


그에비해 후위 연산자는 상대적으로 처리가 복잡하고 코드를 잘 보면 컨테이너 소멸자까지 호출되고 있다.


Why??


std::list 코드를 열어보면




전위 연산자는 자신을 증가 시킨 후 참조형으로 리턴하고 후위 연산자는 임시 개체에 상태를 복사한 후 자신을 증가 시키고 


복사된 임시 객체를 리턴 시키고 있다. 어셈코드가 설명이 되는 부분이다.


결론 int, float, char 등 내부 타입의 경우 성능상 차이가 없지만 객체는 전위 연산자를 사용하는게 더 빠르다.


  1. 증가 후 대입 대입 후 증가 [본문으로]