2009-10-05 3 views
2

이 함수에서 참조 인수를 사용하면 어떤 이점이 있습니까?

다음 클래스를 정의했습니다.

class Action 
{ 
    public: 
    Action(){ _bAllDone = false; } 

    void AddMove(Move & m); 
    private: 
     std::deque<Move> _todo; 
     bool _bAllDone; 
}; 

구성원 AddMove는 다음과 같이 정의됩니다.

void Action::AddMove(Move & m) 
{ 
    _todo.push_back(m); 
} 

이 함수에 대한 참조 인수가 없으면 복사 생성자가 두 번 호출되었습니다. 참조 인수는 한 번만 호출되었습니다. 복사본 생성자를 참조 인수를 사용하는 두 번 이유 대신 한 번만 호출합니까?

답변

17

STL의 deque 클래스는 사용자가 push_back 메서드에 전달한 요소의 복사본을 유지 관리해야합니다. 그것이 한 복사본 생성자가 나오는 곳입니다.

addMove()에서 참조를 제거한 경우 먼저 매개 변수의 복사본을 가져오고 복사 생성자를 한 번 호출 한 다음 뒤로 밀면 두 번째 복사본이 생성됩니다.

복사 생성자의 이중 호출이 낭비되어 참조가 바람직합니다. 그러나 addMove() 매개 변수를 const 참조로 선언해야 요소가 수정되지 않는다는 것을 호출자에게 알릴 수 있습니다. 그러한 확신하에 (당신이 그것을 깨뜨리지 않는다고 가정 할 때), 객체 복사본의 페널티를 지불하지 않고 걱정없이 참조로 객체를 전달하는 것이 안전합니다.

+0

괜찮은 대답이고, const로 전달하는 경우 +1입니다. –

+2

또 다른 중요한 이유는 (코드가 이미 참조를 수정하지 않도록 설계 되었다면 더 중요한 이유가 있다고 말하고 싶다.) const에 대한 참조로 전달하려면 일시적 매개 변수를 매개 변수로 허용하는 것이 좋다 (예 :'action.AddMove Move (/ * ... * /));''AddMove'가'const Move &'를 취하면 유효하지만'Move &'만하면 유효하지 않습니다) – GRB

4

나에게 큰 이점이있는 것 같습니다. 반복적으로 많은 작업을 수행하는 경우 상황이 매우 느려질 수 있습니다. 실제 작업량은 Move 및 해당 복사본 생성자의 정의에 따라 달라집니다. 작은 변화만으로도 성능에 심각한 영향을 줄 수 있습니다. 어느 쪽이든 물어 보면 사본을 전달하는 것이 여전히 두 배나 많은 작업 일 것입니다.

전체 효과는 전체 처리량 중이 작업에 소요되는 비용에 따라 달라집니다. 한 번 해봐, 너는 결코 눈치 채지 못할 것이다. 몇 천 번이나 해보면 중요 할 수 있습니다. 그러나 일반적인 원칙으로 안전하게 참조 할 수있는 곳에 데이터 복사를 피하십시오. 특히이 경우 특별한 명확성이나 복잡성 문제가 없으므로 데이터를 복사하지 마십시오. 속도를 느리게하는 것과 같이 빠르게하는 것이 쉽습니다. 느리게 만드시겠습니까?

0

이어야합니다. 그렇지 않으면 불필요한 (그리고 잠재적으로 부정확 한) 인수 사본이 발생할 수 있습니다. 또한 const이어야합니다. 그렇지 않으면 발신자를 불필요하게 제한하게됩니다.

밑줄이있는 이름은 언어 구현에 예약되어 있으므로 프로그램은 실제로 "정의되지 않음"입니다.

HTH

관련 문제