2013-10-29 2 views
-1

나는 C++ 입문서 5 단원을 읽었습니다. 복사 및 스왑을 사용하는 대입 연산자에서 참조가 아닌 매개 변수를 사용하는 경우에는 괜찮 았지만 다른 대입 연산자에서는 항상 참조 매개 변수를 사용하고 왼쪽 피연산자를 파기하기 전에 오른쪽 피연산자를 복사하여 할당 연산자는 객체가 자신에게 할당되면 올바르게 작동합니다. 왜 우리가 함수 본문에 오른쪽 피연산자를 복사 할 필요가 없도록 나중에 함수 본문에 복사 할 할당 연산자에서 비표준 매개 변수를 사용하지 않습니까?C++에서 할당 연산자의 매개 변수를 참조로 전달해야하는 이유는 무엇입니까?

+1

당신이 말하는 코드를 보여주십시오. – greatwolf

답변

3

복사 할당 연산자는 by-value 매개 변수를 복사본으로 사용하여 복사 및 스왑을 수행하기 위해 일반적으로 값 (참조가 아닌)으로 매개 변수를 가져야합니다.

복사 및 스왑을 수행하지 않으면 복사 할당 연산자가 해당 매개 변수를 참조해야합니다. 복사 및 스왑을하지 않는 이유는 아마도 해당 유형에 대한 특정 최적화 때문입니다. 예를 들어 복사가 가능한 유형의 std::array을 생각해보십시오 (예외 안전성에 관해 이야기하는 번거 로움을 덜어주기는 쉽지 않음). 가능한 가장 효율적인 할당은 바이트를 직접 복사하는 것입니다. 개체의 임시 복사본을 원하지 않으며 확실히 스왑을 원하지 않습니다. 따라서 실제로는 참조로 매개 변수를 취하고 std::copy이라고 쓰고 컴파일러가 최적으로 수행 할 것으로 기대하십시오.

복사 할당 연산자의 특수 케이스 자동 할당은 복사 및 스왑을 사용하는 경우에도 교과서에서 볼 수 있지만 C++ 03에서는 일반적으로 좋지 않습니다. 자체 할당의 경우를 최적화하지만, 참조 별 매개 변수는 임시 할당에서 대입의 경우를 최적화하지 않습니다. C++ 11에서는 임시 할당의 대소 문자가 복사 할당 연산자 대신 이동 대입 연산자로 처리 될 수 있기 때문에 덜 분명하지 않습니다. 그러나 아마 그것은 여전히 ​​불필요합니다. 실제 코드에서는 자체 할당이 매우 드뭅니다. 일반적인 경우의 포인터 비교가 드문 경우의 복사본보다 런타임까지 더해지는 것을 알 수 있습니다.

"C++ Primer"의 5th Edition을 읽지 않았으며 요청한 코드를 표시하지 않기 때문에 할당 연산자가있는 특정 사례에 대해서는 언급 할 수 없습니다 (복사 할당 또는 다른 방법).

미안하지만, 균형 나는이 책이 당신이 말하는 ;-)보다 혼란 통계적으로 가능성이 있다고 생각 :

... 복사 및 스왑을 사용 대입 연산자에 있지만 다른에 대입 연산자

OK

, 그래서 "다른 할당 연산자는"하지 사용하여 복사 및 스왑을 대입 연산자입니까?

우리는 항상 참조 매개 변수를 사용하고 오른쪽 피연산자를 복사하는 경우 왼쪽 피연산자

을 파괴하기 전에 오른쪽 피연산자를 복사 한 후 복사 및 스왑을하고 당신 있습니다 . 또는 복사본을 왼쪽으로 가져 오기 위해 스왑 이외의 다른 방법을 사용하여 사본을 만들었 기 때문에 적어도 그 복사본은 매우 가까이에 있습니다. 어느 쪽이든 함수가 수행하는 첫 번째 작업이 참조 매개 변수를 복사하는 것이면 값으로 매개 변수를 가져와야합니다.객체가 자신에게 할당 된 경우

는 할당 연산자가 올바르게 작동하는지 확인합니다

그 자체 할당을 보장하는 당신의 기술이 제대로 작동하면 다음 항상 오른쪽 피연산자를 복사하는 경우 값으로 매개 변수를 가져와야합니다. 그 밖의 어떤 것도 필요하지 않습니다. 그러나 자체 할당 작업을 보장하는 다른 기술이 있습니다. 이러한 코드 중 하나가 표시되지 않을 수도 있습니다.

+0

답장을 보내 주셔서 감사합니다. 제가 코드를 보여주지 않은 이유는 제가 약간 게으른 이유였습니다. (그리고 나는 분명히 표현할 수 있다고 생각했지만, ... 정말 유감입니다. 내 대답은 당신, 감사합니다. – Sherwin

0

가장 중요한 이유는 효율성입니다. 작은 클래스/구조체의 경우 문제가되지는 않지만 큰 복잡한 클래스 인 경우 다른 문제입니다. 값으로 전달하면 잠재적으로 크고 복잡한 복사 작업을 호출하게됩니다. 아마도 대용량 메모리 할당이 필요할 수 있습니다.

진짜 대답은 때로는 중요하지 않다는 것입니다. 종종 은 실제로 일 뿐이므로 최선의 방법은 항상 참조를 사용하는 것입니다.

+0

하지만 제 경우에는 기능 본문에 나중에 복사합니다.이 둘 사이에 다른 점이 있습니까? – Sherwin

+0

어느 시점에서 항상 복사 또는 할당 중 일부 형식을 수행해야 할 것입니다. 멤버 전체 또는 멤버별로 memcopy 또는 무엇이든간에 의미가 있습니다.하지만 연산자로 값을 전달하면 복사 생성자를 사용하여 연산자의 본문에 들어가기 전에 추가 개체를 만들 수도 있습니다. – mjs

+0

@SteveJessop 당신은 질문을 한 가지 방법으로 읽었습니다. 다른 것이죠. OP가 코드를 게시 한 경우 일 수도 있습니다 ....... – mjs

관련 문제