강력한 예외 안전 보증은 예외가 발생할 경우 작업이 프로그램 상태를 변경하지 않는다고 말합니다. 예외 안전 복사 할당을 구현하는 우아한 방법은 copy-and-swap idiom입니다.C++ 예외 안전 편집증 : 얼마나 많은가?
내 질문은 :
은 비 기본 형식을 변이합니다 클래스의 모든 돌연변이 작동 복사 및 스왑을 사용하는 잔인한시겠습니까?
강력한 예외 안전을위한 성능은 실제로 공정한 거래입니까? 예를 들어
:.
그것은 당신의 응용 프로그램이 당신이 당신 자신의 컴퓨터에 (스펙트럼의 한쪽 끝을)를 실행하는 경우에 실행하는 데 무슨 일인지 환경에 따라class A
{
public:
void increment()
{
// Copy
A tmp(*this);
// Perform throwing operations on the copy
++(tmp.x);
tmp.x.crazyStuff();
// Now that the operation is done sans exceptions,
// change program state
swap(tmp);
}
int setSomeProperty(int q)
{
A tmp(*this);
tmp.y.setProperty("q", q);
int rc = tmp.x.otherCrazyStuff();
swap(tmp);
return rc;
}
//
// And many others similarly
//
void swap(const A &a)
{
// Non-throwing swap
}
private:
SomeClass x;
OtherClass y;
};
답변은 귀하의 도메인에 크게 달려 있으며 답변을받을 수 없습니다. 인생이 그것에 달려있다면 그 해답은 분명합니다. 그것은 성과 위약의 가치가 있습니다. 예외 처리 코드가 예외 발생시 개체를 파괴하면 문제가되지 않습니다. 이제 코드가 어디에 있는지 알아 내야합니다. –
코드를 단일 책임 구성 요소에 올바르게 입력하면 "무료"로 많은 예외 안전성을 얻게됩니다. 당신의 예제에서, 왜 "증분"기능은 "미친 것들"을합니까? 증분 알고리즘이 복잡하고 트랜잭션을 계산하는 방법을 알고 있거나 증분 및 crazystuffing을 분리해야합니다. –
같은 아이디어를 사용하여 회원에게 적용 할 수 있습니다. 전체가 될 필요는 없습니다. 클래스에 문자열 벡터가 포함되어 있고 그 중 하나를 변경해야한다면 어떻게 될까요? 전체 클래스, 벡터 및 전체를 복사/스왑하지 마십시오. 한 줄에 그냥 써라. – BoBTFish