C++ 에서 Vector 컨테이너는 index를 조회하는 두가지 함수를 제공한다.
아래 두개가 그 예시이다.
v.at(index);
v[index];
이것의 차이점은 그러면 무엇일까?
우선 인터넷을 찾아보면 쉽게 알수 있는 정보는 다음과 같다.
v.at(index)를 사용하면, 범위를 점검하기에 안전하고, v[index]는 범위를 점검하지 않기에 빠르다. |
범위를 점검한다? 도대체 무슨 범위를 점검 하는 것일까?
한번 좀더 디테일하게 살펴보도록 하자.
실제로 vector header의 at method를 살펴보면, (line 1557~)
input으로 들어온 index가 벡터의 사이즈를 초과하면, throw 하게 되어있음을 확인 할 수 있다.
당연히 이러한 범위 체크 과정이 들어가기에 속도는 느릴 수 밖에 없다.
그러면 그냥 [index]로 index를 조회하고 예외처리를 해주면 at함수라는게 전혀 필요가 없는게 아닌가? 라는 질문을 할 수 있다.
https://stackoverflow.com/questions/9376049/vectorat-vs-vectoroperator
특별히 at을 언제 사용해야 한다 이런 것이 아니라, 마치 assertion을 걸어주어 사전에 예외를 방지하듯이 at을 사용하는 이유 또한 비슷하다고 생각하면 될 것 같다.
마지막으로, std::vector::operator[]가 std::vector::at() 보다 5~10배 빠르다고 하는데, 단순히 index가 범위 안에 있는지만을 체크하는 과정이 이정도의 속도차이를 유발하는 이유가 무엇일까?
범위를 check하는 것과 uncheck하는 것은 굉장히 다르다.
uncheck를 하면, 단순한 instruction으로 즉시 알수있다. (almost one instruction)
하지만, check를 하게 되면 훨씬 복잡한 과정을 거쳐야한다.
1. memory에서 size정보를 꺼내오는 과정(memory access process is very slow) 2. comparing it with index 3. conditional branch handling |
아마 size를 알아오는 과정이 굉장히 오래걸리는 과정이지 싶다.
'공부 > C++' 카테고리의 다른 글
[C++] map과 defaultdict (0) | 2022.08.19 |
---|