C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
분야별 포럼
C++빌더
델파이
파이어몽키
C/C++
프리파스칼
파이어버드
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

자유게시판
세상 살아가는 이야기들을 나누는 사랑방입니다.
[24933] 모던 C++11 공부 하다가 auto 에서 도무지 이해 안가는 부분
bugfree [bugfree] 5688 읽음    2014-10-23 23:00
auto k = 7;  
로 하면 컴파일러가 7을 보고 k 가 int 타입인걸 알아내서
int k = 7;
로 하는것과 같은 코드를 만든다고 알고 있습니다

근데 다음 코드는 도무지 이해가 안되네요

std::map <std::string, int> map;

map에 데이타를 무작위로 왕창 넣어두고
아래 처럼 출력해보면 속도가 다릅니다

1번 방법

for ( const std::pair <std::string, int> &_pair : map )
         std::cout << _pair.second << std::endl;

2번 방법

for ( const auto &_pair : map )
         std::cout << _pair.second << std::endl;

속도를 빠르게 하기 위해 두경우 다 레퍼런스 타입을 썼고
auto를 이용해도 위에서 auto k = 7; 과  마찬가지로
컴파일 하면 1번과 2번이 같은 결과가 나와야 정상인데
막상 실행 해보면 항상 2번 방법이 빠르게 나옵니다
도데체 이유를 모르겠습니다


박우성 [solgari]   2014-10-24 10:27 X
제가 요즘 C++11을 많이 이용하려고 하고, 관심도 많은 데요.
재미 있는 주제라서, 함 테스트 해 보았는데, 역시 auto를 사용한 방법이 더 빠르네요. (MS VS 2013)

그래서, map의 소스를 보니까, 답이 나오네요.

typedef pair<const _Kty, _Ty> value_type;


키에 해당하는 부분에 const가 붙어 있습니다.

for ( const std::pair <const std::string, int> &_pair : map ) 와 같이 하면 auto와 속도가 같게 됩니다.

const를 빼버리면 당연히 값에 대한 복사가 일어나서, 그만큼 시간이 더 걸리는 것입니다.
빌더(TWx) [builder]   2014-10-24 11:09 X
박우성님 얘기가 맞는 말입니다.

질문에선 std::map을 예로 들었는데... std::unordered_map도 마찬가지 입니다.
key/value 쌍을 다루기 위해 Container 를 구현하면서 std::pair가 사용된 거고, key 값은 목적이 값을 빨리 찾기 위해서 hash 펑션에 의해서
해쉬키의 의미로 사용되는 거니까 Container의 element인 pair를 <const Key, Value> 타입으로 구현하게 된 거죠.

소스에 나타나 있는 코드로만 보면 const auto & _pair가 <std::string, int> 타입으로 deduction(추론) 된 것으로 오해하기 쉽상이지만
여기서 deduction 된 auto는 템플릿 파싱단계에서 파서에 의해서 추론된... Conatainer에 구현되어있는 element인 pair<const Key, value>입니다.
빌더(TWx) [builder]   2014-10-24 11:17 X
따라서 2번째 방법(auto 사용)과는 달리... 1번 방법은 타입이 매칭되지 않기 때문에 컴파일러가 Temporary 객체를 임시로 생성해서
const reference 타입인 _pair에 바인딩 하는 코드를 생성해야 합니다. 결과적으로 range-based 루프에서 반복적으로 Temporary 객체의
생성/소멸 반복을 초래하게 되는 거죠.
빌더(TWx) [builder]   2014-10-24 11:26 X
템플릿 Container가 C++11을 지원해서 move constructor가 구현되어 있다면 그나마 복제비용이 덜하지만, 컴파일러에 의해서 암시적으로
Temporary 객체가 생성되는 경우가 있을 수 있기 때문에... 템플릿이나 클래스를 구현할 땐... 항상 r-value reference를 이용한 move constructor도 같이 구현해 주는 게 효과적 입니다.



+ -

관련 글 리스트
24933 모던 C++11 공부 하다가 auto 에서 도무지 이해 안가는 부분 bugfree 5688 2014/10/23
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.