C++에서 i++(후위 증가 연산자)와 ++i(전위 증가 연산자)는 최종적으로 변수 i의 값을 1씩 늘린다는 점에서 결과는 동일합니다. 하지만 동작 순서에는 중요한 차이가 있습니다.
- i++ (후위 증가): 현재 값을 먼저 사용(할당)한 뒤,
i의 값을 1 증가시킵니다. - ++i (전위 증가):
i의 값을 먼저 1 증가시킨 뒤, 증가된 값을 사용(할당)합니다.
아래 예제 코드를 통해 그 차이를 직접 확인해 보겠습니다.
예제 코드
#include<iostream>
using namespace std;
int main() {
int x = 3, y, z;
y = x++; // y에 x의 기존 값(3)을 대입한 후 x는 4가 됨
z = ++x; // x를 먼저 5로 증가시킨 후 z에 대입
cout << x << ", " << y << ", " << z;
return 0;
}실행 결과
5, 3, 5
이처럼 두 연산자는 같은 작업을 수행하지만 처리 순서가 다릅니다. 그렇다면 자연스럽게 이런 의문이 생깁니다. 두 연산자 사이에 성능 차이가 존재할까요?
성능은 아키텍처에 따라 달라집니다
이 연산들의 실제 성능은 실행되는 하드웨어 아키텍처에 크게 의존합니다. 어느 쪽이든 결국 메모리에 저장된 값을 읽고 증가시킨 후 다시 저장하는 작업이 필요하므로, 폰 노이만 병목(Von Neumann bottleneck)이 두 경우 모두에서 성능의 제한 요소로 작용합니다.
그래도 ++i가 약간 더 빠릅니다
일반적으로 ++i가 i++보다 약간 더 빠르다고 말할 수 있습니다. 그 이유는 다음과 같습니다.
i++는 값을 증가시키기 전에 원래 값의 임시 복사본(temporary copy)을 생성해야 합니다.++i는 이러한 임시 복사본 없이 바로 값을 증가시키므로 불필요한 오버헤드가 없습니다.
컴파일러가 이 차이를 인식하고 코드를 최적화해 주는 경우도 있습니다. 예를 들어 증가된 값이 이후에 사용되지 않는 단순 문장(i++; 또는 ++i;)에서는 대부분의 컴파일러가 동일한 기계어 코드를 생성합니다. 하지만 이러한 최적화가 항상 적용되는 것은 아니며, 모든 컴파일러와 모든 상황에서 유효한 것도 아니기 때문에 성능이 중요한 코드, 특히 반복문이나 C++ 객체·반복자(iterator)를 다룰 때는 ++i를 사용하는 것이 안전하고 효율적인 습관입니다.