일상에서 멍때리기
[C/C++] ++i 와 i++ 의 차이 본문
전위전산자와 후위연산자
간단히 보면 전위전산자(++i)는 값이 먼저 증가하고 작업이 수행되며
후위연산자(i++)는 작업이 수행된 후에 값이 증가한다고 배웠다.
간단한 예를 들어보자
* 전위연산자(++i)
char a[4] = "abcd";
int i = 0;
printf("%c\n", a[++i]);
output
b
1
*후위연산자(++i)
char a[4] = "abcd";
int i = 0;
printf("%c\n", a[i++]);
printf("%d\n", i);
return -1;
output
a
1
와 같이 모든 동작 수행후 i는 0->1로 증가되었지만 출력된 문자를 보면 어떻게 동작되었는지 이해가 갈것이다.
그렇다면 속도면에서는 어떠할까?
요즘같이 컴파일러가 좋아진 상황에서는 기본타입(int, float, double등등)은 아무 상관없지만 사용자 정의 클래스의 경우에는 큰 차이가 발생한다.
아래의 예제를 보자
#include<iostream>
using namespace std;
class test
{
public:
test():i(0)
{
cout << "* Create Object *"<< endl;
}
test& operator++()
{
i++;
return *this;
}
const test operator++(int dummy)
{
test t;
t = *this;
++*this;
return t;
}
test& operator=(const test& t)
{
i = t.i;
return *this;
}
int i;
};
int main(void)
{
cout<<"Start!!"<<endl;
test a;
cout<<"++a"<<endl;
cout<<"=============================="<<endl;
++a;
++a;
cout<<"a++"<<endl;
cout<<"=============================="<<endl;
a++;
a++;
cout<<"End!!"<<endl;
return 1;
}
output
Start!!
* Create Object *
++a
==============================
a++
==============================
* Create Object *
* Create Object *
End!!
위의 예제에서 볼 수 있듯이 전위연산자(++i)의 경우 연산만을 수행하는 반면 후위연산자의 경우 현재 값을 리턴한 후에, 값을 증가해야 하기 떄문에 내부에 복사 생성을 하게 된다. 그렇기 때문에 클래스의 크기가 커지면 커질수록 복사생성의 오버헤드가 커질 것이다.
결론
1. 내부 타입의 경우 속도가 같다.
2. 객체의 경우 전위연산자가 빠르다.
'프로그래밍 > 개발이야기' 카테고리의 다른 글
Ripple Effect ( 물결 효과, 왜곡 효과 ) (0) | 2014.04.21 |
---|---|
ruby on rails 폴더 구조 (0) | 2014.04.14 |
[C] trim - string 함수 구현 (0) | 2014.04.14 |
[C] char[] 와 char *의 차이 (2) | 2014.04.14 |