[GPG 1 글 1.4] STL VECTOR에 관해 질문 드립니다.

GPG 시리즈 관련 질답, 논의 공간.

Moderator: 류광

비회원

STL VECTOR에 관해 질문 드립니다.

Post by 비회원 »

Code: Select all

for(int i = 0; i < vector.size(); i++){
...
}

for(vector<int>::iterator i = vector.begin(); i != vector.end(); i++){
...
}
위의 두 가지 방식으로 LOOP를 돌 수 있는 것으로 알 고 있습니다.
물론 STL이 루프에 대해 쓰레드 안전하지 않다는 것을 알 고 있습니다만

1 번째 방식으로 루프를 돌면 도중에 vector의 개수가 바뀌었을 때 뻑이 날 가능성이 좀 더
크지 않을까 생각이 듭니다.

그래서 2 번째 방식이 더 좋지 않나 생각이 드는데요. 아무래도 반복자를 사용하고 있으니까 좀 더,
효율도 좋지 않을까 생각이 드는데 제 생각이 맞는지 정확히 모르겠어서

경험 많으신 개발자 분들께서 이 글을 보시고 답변이나 조언해 주시면 감사하겠습니다.

감사합니다.
uhmgoon
Posts: 96
Joined: 2008-01-29 14:21

Post by uhmgoon »

컴파일러가 똑바로만 컴파일한다면 (최근의 컴파일러는 모두 다 괜찮습니다만) 위의 코드나 아래의 코드나 성능이나 오류의 여지는 차이가 없습니다.
위의 코드가 사이즈 변경시 경계침범 오류를 낸다면, vector.size()를 루프 돌입 전에 저장해 놓고 루프 내에서 참조하는 경우인데, 이는 vector.end()를 루프 돌입 전에 저장해 놓고 참조하는 것과 다를 바가 없는 최적화입니다. 성능 면에서도 최근(대략적으로 2000년대 이후의) 컴파일러는 루프 내에서 배열을 정수 인덱스로 참조하나, 포인터/이터레이터로 참조하나 거의 동일한 코드를 만들어 냅니다. 이런 면에 대한 고민은 크게 신경쓰실 필요가 없을 것 같습니다.
하지만 아래쪽 코드가 더 좋은 면이 있다면, 컨테이너 변경에 대해 좀 더 robust한 특성이 있다는 정도가 아닐까 싶습니다. 이를테면, 정수 인덱스를 쓸 수 없는 연관 컨테이너로 바뀐다거나 하는 상황에서도 유효한 코드겠지요.
비회원

Post by 비회원 »

애초부터 멀티 쓰레드에서 접근가능한 STL 이라면 락없이 루프도는거 자체가 에러기때문에 , 어느게 더 에러
상황이 자주 발생할수 있는가는 의미가 없습니다

위에것 10% 확률로 뻑나고 밑에것은 5% 확률로 뻑난다고 해서


아래게 더 좋지 않냐는 말을 한다면 프로그래머의 자질을 의심해야 할것입니다

애초부터 애러가능성이 있는건 둘다 틀린겁니다
비회원

답변 감사합니다. 한 가지 더 질문있습니다.

Post by 비회원 »

for(int i = 0; i < vector.size(); i++)
여기서 루프를 진입하기 전에 vedtor.size()의 값은 루프를 돌때마다 갱신되는 것이 아니라
루프에 들어가기 전에 딱 상수로 고정이 된다는 말씀이시죠?

그리고
for(vector<int>::iterator i = vector.begin(); i != vector.end(); i++
에서도 vector.begin()과 vector.end()는 루프를 돌기전에 이미 상수 주소 값으로 고정되는 게
되는 거군요~

보시면 답변 부탁드리겠습니다. 작은 부분이지만, 이전부터 헤깔리던 부분이어서 궁금하네요.

여담이지만 gpgstudy에 책 관련 이외의 내용은 자유롭게 질문을 할 수가 없다보니
이전처럼 게임 프로그래밍 관해 Q/A 활성화 된 다른 여타 사이트 하나만 추천해 주시면
감사하겠습니다.
비회원

Re: 답변 감사합니다. 한 가지 더 질문있습니다.

Post by 비회원 »

비회원 wrote:for(int i = 0; i < vector.size(); i++)
여기서 루프를 진입하기 전에 vedtor.size()의 값은 루프를 돌때마다 갱신되는 것이 아니라
루프에 들어가기 전에 딱 상수로 고정이 된다는 말씀이시죠?

그리고
for(vector<int>::iterator i = vector.begin(); i != vector.end(); i++
에서도 vector.begin()과 vector.end()는 루프를 돌기전에 이미 상수 주소 값으로 고정되는 게
되는 거군요~

보시면 답변 부탁드리겠습니다. 작은 부분이지만, 이전부터 헤깔리던 부분이어서 궁금하네요.

여담이지만 gpgstudy에 책 관련 이외의 내용은 자유롭게 질문을 할 수가 없다보니
이전처럼 게임 프로그래밍 관해 Q/A 활성화 된 다른 여타 사이트 하나만 추천해 주시면
감사하겠습니다.
답변을 봐선 왜 이렇게 결론을 내렸는지 도저히 알수가 없네요


size(), begin(), end() 함수가 상수로 고정된다는건 , 너무 상상하신거 같습니다 저 함수는 클래스의
내부 변수 값을 가져오는거에 불과하고 루프땜마다 매번 값을 가져오게 됩니다

다만 함수호출은 인라인 최적화로 함수 호출 부하정도는 없애줄수 있겠죠
Post Reply