2013-05-09 2 views
7

, 당신은 할 경우 ++i 또는 i++을 사용하는 경우 "복사"이동 생성자를 사용하여 사용자 정의 형식의 객체, 그것은 어떤 차이를 만들 않는 for 루프 루프 카운터로?이동 생성자와 사후 증가 대 선행 증가 C++에서

나는이 질문이 다소 모호하게 보인다는 것을 알고 있지만 나는 (나는) 전화 인터뷰에서이 질문을했다. 나는이 질문을 올바르게 이해했는지 확신 할 수 없었습니다. 면접관은 이것을 대답을 알지 못하는 것으로 생각하고 인터뷰를 줄였습니다.

그는 무엇에 빠져 있었습니까?

C++에서
+0

Herb Sutter의 [GotW # 2 해결책 : 임시 개체] (http://herbsutter.com/2013/05/13/gotw-2-solution-temporary-objects/)도 참조하십시오. – jww

답변

10

하면이 경우 "복사"이동 생성자를 사용하여 사용자 정의 타입의 객체 [...] 모든

우선, 이동 생성자에 사용되는 루프 은 복사로 이동한다는 사실을 깨닫습니다. 사실 복사 가능 구조의 클래스도 move-constructible입니다. 그렇다면 왜 명시 적으로 move 생성자를 정의해야합니까?

[...] 루프 카운터로 ++ i 또는 i ++를 사용하면 어떤 차이가 있습니까?

무엇이 i에 달려 있습니다. int과 같은 스칼라 객체 인 경우 아무런 차이가 없습니다. i 클래스 타입의 반복자 인 경우 operator ++의 구현이 반복자의 복사본을하기 전에 반환 할 만들 필요가 없기 때문에

, 다른 한편으로는, ++i은 (순전히 이론적 인 지상에) 더 효율적한다 반복자 자체가 증가합니다. 당신이 볼 수 있듯이

_Self& 
operator++() 
{ 
    _M_node = _M_node->_M_next; 
    return *this; 
} 

_Self 
operator++(int) 
{ 
    _Self __tmp = *this; 
    _M_node = _M_node->_M_next; 
    return __tmp; 
} 

는 후위 버전 (하나는 더미 int을 받아들이는) 더 많은 작업이 있습니다 여기에

, 예를 들어, std::list의 반복자 유형에 대한 증가 연산자를 정의하는 방법 stdlibC++입니다 해야 할 일 : 원래 반복기의 복사본을 만들어서 재 작성하고 이터레이터의 내부 포인터를 변경 한 다음 복사본을 반환해야합니다.

반면에 접두어 버전은 내부 포인터를 변경하고 자체 참조를 반환해야합니다.

그러나 성능과 관련하여 모든 가정은 측정에 의해 백업되어야한다는 점에 유의하십시오. 이 경우이 두 함수간에 현명한 차이가있을 것으로 기대하지는 않습니다.

+1

"복사"부분에 있습니다. 나는 그 단어를 사용해서는 안된다는 것을 알았습니다. 그래서 이것은 이동 건설 그 자체와 아무런 관련이 없습니다. 그것은 ints 대 iterators와 관련이 있습니까? – Scott

+0

@ Scott : 사실 그렇습니다. 예를 들어 대답을 확장하려고합니다. –

+0

앤디가 rh 값이 lvalue이면 이동이 위험 할 것입니다. –

관련 문제