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)이 반환 *;
이 기사가 도움이 생각? 에 오신 것을 환영합니다 엄지 손가락은 더 많은 사람들과 공유 할 수 있습니다.
더 업데이트 된 기사를 읽고, 객체 지향 사고의 마이크로 채널 대중 번호로하시기 바랍니다에주의 []