C ++ 핵심 원칙 C.62는 : 자기에게 할당에 대한 안전 복사 할당을 보장하기 위해

C. 62 : 복사 할당 할당을위한 메이크업 자체 안전
C 62 :. 복사 할당은 자체 평가의 안전을 보장하기 위해

 

 

 

이유 (이유)

X = x는 x의 값을 변경하면, 사람들은 놀라게 될 것입니다 나쁜 오류 (종종 누수 포함)이 발생합니다.

X = x는 x의 값을 변경 한 경우, 사람들은 아주 이상한 찾을 수 있지만, 아주 나쁜 오류가 발생합니다. (일반적으로 누출 포함)

 

 

실시 예 (실시 예)

표준 라이브러리 컨테이너는 우아하고 효율적으로 자동 할당을 처리 :

표준 라이브러리 컨테이너 취급자가 할당 우아하고 효율적인 방법 :

 

std::vector<int> v = {3, 1, 4, 1, 5, 9};
v = v;
// the value of v is still {3, 1, 4, 1, 5, 9}

 

 

 

Note (주의)

핸들 자체 할당이 제대로 자기 임무를 처리하는 회원들로부터 생성 된 기본 할당.

기본 할당의 올바른 취급에 생산은 자기 스스로 할당 문제의 구성원에 할당됩니다.

 

struct Bar {
    vector<pair<int, int>> v;
    map<string, int> m;
    string s;
};

Bar b;
// ...
b = b;   // correct and efficient

 

 

 

Note (주의)

(예를 들어, 스왑을 사용하여) 명시 적으로 자기 과제에 대한 테스트하여 자기 임무를 처리 할 수 ​​있지만, 종종 이러한 테스트하지 않고 대처하기 위해 신속하고 우아한.

당신은 신속하고 우아한 방법 (스왑을 사용하여, 예를 들어) 치료의 검사를 사용하지 않는 일반적으로 명시 자기 검사에 할당 된 할당 자체를 방지 할 수 있지만.

 

class Foo {
    string s;
    int i;
public:
    Foo& operator=(const Foo& a);
    // ...
};

Foo& Foo::operator=(const Foo& a)   // OK, but there is a cost
{
    if (this == &a) return *this;
    s = a.s;
    i = a.i;
    return *this;
}

 

이것은 분명히 안전하고 분명히 효율적이다. 그러나, 우리가 백만 과제 당 하나의 자기 할당을한다면? 의 백만에 대한 중복 검사 (대답은 본질적으로 항상 동일하기 때문에하지만, 컴퓨터의 분기 예측은 바로 본질적으로 모든 시간을 생각한다)있다. 치다:

이 방법은 안전하고 효율적인 것 같다. 자기 할당의 경우는 그 아래 백만 할당 발생하면 어떻게 될까요? 백만 대한 추가 검사 (하지만 결과는 항상 동일합니다 본질적으로, 컴퓨터의 분기 예측은 항상 권리를 추측한다)가있다. 다음 코드를 살펴 보자 :

 

Foo& Foo::operator=(const Foo& a)   // simpler, and probably much better
{
    s = a.s;
    i = a.i;
    return *this;
}

 

표준 : : 문자열은 자기 할당을위한 안전하고 너무 INT 있습니다. 모든 비용은 자기 할당의 (희귀 한) 경우에 의해 수행됩니다.

너무 자기 안전, 인터넷 용 표준 : : 문자열 할당. 제 (거의) 자기 할당이 발생에서 모든 비용이다.

 

 

시행 (제안)

(단순) 할당 연산자는 패턴을 포함하지 않아야하는 경우 (이 == a)이 반환 *; ???

(단순) 할당 연산자는 다음 검사 포함하지 않아야하는 경우 (이 == a)이 반환 *;

 


 

이 기사가 도움이 생각? 에 오신 것을 환영합니다 엄지 손가락은 더 많은 사람들과 공유 할 수 있습니다.

더 업데이트 된 기사를 읽고, 객체 지향 사고의 마이크로 채널 대중 번호로하시기 바랍니다에주의 []

发布了408 篇原创文章 · 获赞 653 · 访问量 29万+

추천

출처blog.csdn.net/craftsman1970/article/details/104680070