>  기사  >  백엔드 개발  >  이동 할당 연산자에 `if (this != &rhs)` 확인이 필요합니까?

이동 할당 연산자에 `if (this != &rhs)` 확인이 필요합니까?

DDD
DDD원래의
2024-11-28 00:33:11203검색

Is the `if (this != &rhs)` Check Necessary in a Move Assignment Operator?

이동 할당 연산자 및 if (this != &rhs)

클래스의 표준 복사 할당 연산자에서는 할당된 객체가 호출 객체의 변경을 피하기 위해 if (this != &rhs)를 사용하는 호출 객체와 동일합니다. 그런데 이동 할당 연산자에 이 확인이 필요한가요?

이동 의미

operator=(Class&&)로 표시되는 이동 할당 연산자는 리소스의 소유권을 효율적으로 이전하기 위해 설계되었습니다. 한 개체에서 다른 개체로. 복사 할당과 달리 객체의 새 복사본을 생성할 필요가 없습니다.

상황 분석

이것이 == &rhs?

이 == &rhs가 이동 할당에서 참일 수 있는지 여부에 대한 의문이 제기됩니다. 연산자.

객체가 rvalue 참조에 바인딩되는 경우 두 가지 시나리오가 있습니다.

    실제 임시 객체입니다.
  1. 호출자가 가장하는 객체입니다. 임시여야 합니다.
첫 번째 경우 개체는 임시 개체에 대한 고유한 참조이므로 this == &rhs는 불가능합니다. 두 번째 경우에는 this != &rhs를 확인하는 것이 호출자의 책임이므로 검사가 필요하지 않습니다.

검사하지 않음에 대한 인수

저자는 if(this != &rhs) 다음과 같은 이유로 검사가 중복됩니다.

    임시 직원에 대한 자체 할당 불가능합니다.
  • 고의적으로 운영자를 속이는 클라이언트는 코드를 수정해야 합니다.
이 검사를 생략하면 개체가 자주 이동하고 자신에게 할당되는 상황에서 성능을 향상시킬 수 있습니다. .

확인 인수

그러나 일부에서는 this != 자체 이동 할당을 방지하려면 여전히 &rhs 확인이 필요합니다. 그들은 swap(x, x)를 유효한 작업으로 허용하면 이 검사가 실행될 수 있다고 주장합니다.

솔루션 및 고려 사항

저자는 다음과 같이 결론을 내립니다.

복사 및 과제 이동 사후 조건:

  • 복사 할당: 자체 복사 할당의 경우를 포함하여 y 값은 변경되지 않은 상태로 유지되어야 합니다.
  • 이동 할당: y는 유효하지만 지정되지 않은 상태여야 합니다. self-move-location.

자체 이동 할당 구현:

이를 달성하려면 다음과 같은 클래스에서 이동 할당 연산자에 대해 세 가지 구현이 가능합니다. dumb_array가 제공됩니다:

1. 구별하기 위해 검사가 수행됩니다. 자체 이동 할당을 수행하고 개체를 유효한 상태로 설정한 후 진행합니다.

2. 체크인이 생략되어 자체 이동 할당이 작동하지 않습니다.

3. 클래스가 즉시 사용해야 하는 리소스를 보유하지 않는 경우 swap(other) 메서드가 사용됩니다. 출시되었습니다.

저자는 최상의 구현은 특정 클래스 디자인, 하드웨어 특성 및 성능 요구 사항에 달려 있다고 강조합니다.

클래스가 메모리를 직접 관리하지 않는 경우에는 연산자=(Class& &) = 기본값; 기본적인 예외 안전을 바탕으로 최고의 성능을 구현합니다.

위 내용은 이동 할당 연산자에 `if (this != &rhs)` 확인이 필요합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.