2012-04-28 7 views
2

에게 STL 목록의 구문을 삽입 :: :: 삽입은 다음과 같습니다 -매개 변수

iterator 
    insert(iterator __position, const value_type& __x); 

은 왜 반복자 대신 반복자에 참조가 전달되는?

+1

다른 이유는 무엇입니까? –

+1

반복자는 일반적으로 참조가 아닌 C++에서 값으로 전달됩니다. 하지만이 대회가 어디서 생겨 났는지는 잘 모르겠습니다. – templatetypedef

+0

@KerrekSB 왜냐하면 일반적으로 const에 대한 참조가 임시 (및 생성자 복사)를 피하기 위해 선호되기 때문에이 질문을하는 이유입니다. 그러나 templatetypedef가 언급했듯이, 이것은 Convention과 Potatoswatter가 컴파일러가 컨벤션에 대해 말할 수있는 컴파일러를 최적화한다는 아래 설명에서 설명합니다. 아니면 그것에 더 많은 것이 있습니까? 감사. – nightlytrails

답변

1

구현은 값 대신 const 참조로 반복기를 전달할 수 있습니다. 관련된 의미 상 차이점은 없습니다.

이 경우 값 전달은 약간 더 효율적입니다. iterator 개체는 힙의 목록 요소 개체에 대한 단일 포인터를 포함합니다. 참조로 전달하는 것은 본질적으로 포인터를 통해 장면 뒤에서 지나가는 것을 기억하십시오. (참조가 이 아니고이 포인터와 같지만 실제로 함수 호출 경계를 넘을 때는 다른 실행 가능한 구현이 없습니다.)

따라서 값을 전달하면 힙에 대한 포인터가 전달되지만 참조로 전달하면 iterator에 대한 포인터가 전달되고 insert 함수에는 두 개의 방향 전환이 필요합니다. (이것은 ABI에 의존하지만, 어쨌든 값으로 전달하는 단점이있을 수 없습니다 이론적으로한다.) 통과 의미의

빠른 그림 :

template< typename param > 
void same_params(param a, param b) { 
    std::cout << (&a == &b) << '\n'; 
} 

int main() { 
    int const five = 5; 
    same_params< int const & >(five, five); // true 
    same_params< int const & >(five, 6); // false 
    same_params< int const & >(five, 5); // unspecified 
    same_params< int const & >(5, 5); // unspecified 

    same_params<int>(five, five); // false (for any arguments) 
} 

http://ideone.com/2mC07

이 weren 히가 ' 포인터를 전달하면 same_params< int const & >이 작동하지 않습니다.

관련 문제