728x90
결론부터 말하면, ++i를 사용하는 것이 i++보다 속도 효율이 더 좋을 수도 있습니다.
아래와 같이, int 와 같은 타입은 사실 거의 영향이 없습니다.
for (int i=0; i<n; ++i){
...
}
반면, 무거운 타입을 가진 컨테이너의 반복자(iterator)를 사용할 때는 상황이 달라지기도 합니다.
#include <map>
using std::map;
struct SuperHeavyStruct{
...
}
map<int, SuperHeavyStruct> mymap;
for (map<int, SuperHeavyStruct>::iterator it = mymap.begin(); it != mymap.end(); ++it){
...
}
it++ 은 먼저 반복자 자신 객체의 복사본을 만들고,
원래 객체 인덱스를 증가시킨 다음에,
자신이 만든 복사본을 반환합니다.(즉 이전 반복자의 복사본을 반환합니다.)
우리는 이 복사본이 필요없기 때문에, 시간낭비입니다.
하지만, ++it은 복사본은 생성하지 않으면서,
원래 객체 인덱스를 증가시키고 그 객체를 바로 반환합니다.
참고로 ++i 와 i = i + 1은 같은 표현입니다. (2021-03-15 추가)
따라서 조금 더 효율이 좋다고 말할 수 있지만,
최근의 컴파일러는 똑똑하게도, 이런 부분을 알아서 조절해주어 거의 성능차이가 없다고 합니다.
그러나, 이 부분을 알고 있는 사람입장으로써는 명시적으로 ++it을 표기해주는 것이 좋다고 생각합니다.
물론, 큰 문제는 없습니다.
[Reference - https://stackoverflow.com/questions/6926930/it-or-it-when-iterating-over-a-map]
728x90
'lang > C,C++' 카테고리의 다른 글
[C] 자료형, 변수, 배열 등의 크기를 알아봅시다. (970) | 2019.10.11 |
---|---|
[Class와 OOP] 6. OOP 다형성, 가상함수, 추상클래스, 순수가상함수 (1262) | 2019.10.09 |
[Class와 OOP] 5. OOP 상속성, (overloading vs overriding) (962) | 2019.10.09 |
[Class와 OOP] 4. OOP 캡슐화, 프렌드(freind), static, const 멤버 변수, 함수 (1013) | 2019.10.09 |
[Class] 3. Class - 연산자오버로딩 (953) | 2019.10.09 |
댓글