코드리뷰를 하며 나는 잘 사용하지 않던 전위 증가에 대해 문득 궁금증이 들어 찾아보게 됐다.
알고리즘을 풀든 일을 하든 for 문이나 카운트 등에서 항상 cnt++
이런식으로만 작성해왔는데
다른 글들을 보면 ++cnt
로 써있는 경우가 많았다.
결론부터 써보자면 전위 연산을 사용하는 것이 대부분의 상황에서 후위연산보다 효율적이었다.
둘의 핵심적인 차이는 연산자가 연산 후 반환하는 값에 있었다.
표현 | 동작 방식 | 반환값 |
---|---|---|
++cnt |
전위 증가 : 값을 먼저 1 증가 시킴 | 증가된 값 |
cnt++ |
후위 증가 : 값을 먼저 반환하고 1 증가 | 원래 값 |
각 동작의 내부 동작을 확인해보면,
후위 증가 내부 동작
//! int res = cnt++;
int temp = cnt;
cnt = cnt + 1;
return temp;
전위 증가 내부 동작
//! int res = ++cnt;
cnt = cnt + 1;
return cnt;
다음과 같이 cnt++
는 임시 변수 생성과 데이터 복사가 일어난다.
int 나 char 와 같은 경우에는 차이가 눈에 띄게 보이지 않을 수 있지만,
map 이나 vector 와 같은 객체에서 사용하는 iterator++
와 같은 경우는 보이지 않는 곳에서 객체 복사 생성자를 호출해 눈에 띄는 오버헤드를 유발할 가능성이 있다.
cnt++
과 같은 후위 연산자는 증가 시키기 전 원래 값이 필요한 경우가 아닌 경우에는 안쓰는 것이 좋을 것으로 보인다.
'cs' 카테고리의 다른 글
Singleton Pattern (0) | 2024.06.02 |
---|---|
객체지향형과 절차지향형 (0) | 2024.05.28 |