" as-if "규칙은 무엇입니까?
" as-if "규칙은 기본적으로 합법적 인 C ++ 프로그램에서 구현이 수행 할 수있는 변환을 정의합니다. 요컨대, 프로그램의 " 관찰 가능한 동작 "에 영향을주지 않는 모든 변환 이 허용됩니다 (정확한 정의는 아래 참조).
목표는 프로그램의 동작이 추상 기계 측면에서 C ++ 표준에 지정된 의미를 준수하는 한 구현에 최적화를 수행 할 수있는 자유를 제공하는 것입니다.
표준은이 규칙을 어디에 도입합니까?
C ++ 11 표준은 1.9 / 1 항에 " as-if "규칙을 도입합니다 .
이 국제 표준의 의미 설명은 매개 변수화 된 비 결정적 추상 기계를 정의합니다. 이 국제 표준은 준수 구현의 구조에 대한 요구 사항을 지정하지 않습니다. 특히 추상 기계의 구조를 복사하거나 에뮬레이트 할 필요가 없습니다. 오히려, 아래에 설명 된대로 추상 기계 의 관찰 가능한 동작 을 에뮬레이트하기 위해서는 준수 구현이 필요 합니다.
또한 설명 각주는 다음을 추가합니다.
이 조항은 관찰 가능한 행동으로부터 결정될 수있는 한, 결과가 마치 요구 사항을 준수한 것처럼 결과가이 국제 표준의 요구 사항을 무시할 수 있기 때문에 "as-if"규칙이라고도합니다. 프로그램의. 예를 들어, 실제 구현은 해당 값이 사용되지 않고 프로그램의 관찰 가능한 동작에 영향을 미치는 부작용이 발생하지 않는다고 추론 할 수있는 경우 표현식의 일부를 평가할 필요가 없습니다.
규칙은 정확히 무엇을 요구합니까?
1.9 / 5 항은 다음을 추가로 명시합니다.
잘 구성된 프로그램을 실행하는 준수 구현 은 동일한 프로그램 및 동일한 입력을 사용하여 추상 기계의 해당 인스턴스의 가능한 실행 중 하나와 동일한 관찰 가능한 동작을 생성해야합니다 . 그러나 그러한 실행에 정의되지 않은 작업이 포함되어있는 경우이 국제 표준은 해당 입력으로 해당 프로그램을 실행하는 구현에 대한 요구 사항을 지정하지 않습니다 (첫 번째 정의되지 않은 작업 이전의 작업에 대해서도).
이 제약은 "잘 구성된 프로그램을 실행" 할 때만 적용되며 정의되지 않은 동작을 포함하는 프로그램을 실행할 때 가능한 결과는 제약이 없다는 점을 강조 할 가치가 있습니다. 이것은 1.9 / 4 절에도 명시되어 있습니다.
다른 특정 연산은이 국제 표준에서 정의되지 않은 것으로 설명됩니다 (예 : const 객체 수정 시도의 효과). [참고 : 이 국제 표준은 정의되지 않은 동작을 포함하는 프로그램의 동작에 대한 요구 사항을 부과하지 않습니다 . —end note]
마지막으로, " 관찰 가능한 행동 " 의 정의와 관련하여 1.9 / 8 항은 다음과 같습니다.
준수 구현에 대한 최소 요구 사항은 다음과 같습니다.
— 휘발성 객체에 대한 액세스는 추상 기계의 규칙에 따라 엄격하게 평가됩니다.
— 프로그램 종료시, 파일에 기록 된 모든 데이터는 추상 의미론에 따라 프로그램을 실행했을 때 발생할 수있는 결과 중 하나와 동일해야합니다.
— 대화 형 장치의 입력 및 출력 역학은 프로그램이 입력을 기다리기 전에 프롬 프팅 출력이 실제로 전달되는 방식으로 발생해야합니다. 대화 형 장치를 구성하는 것은 구현에 따라 정의됩니다.
이를 총체적으로 프로그램의 관찰 가능한 동작이라고합니다 . [ 참고 : 추상과 실제 의미 간의보다 엄격한 대응은 각 구현에 의해 정의 될 수 있습니다. — 끝 참고 ]
이 규칙이 적용되지 않는 상황이 있습니까?
내가 아는 한, " as-if "규칙에 대한 유일한 예외 는 복사 / 이동 제거이며, 이는 클래스의 복사 생성자, 이동 생성자 또는 소멸자가 부작용이 있더라도 허용됩니다. 이에 대한 정확한 조건은 12.8 / 31 절에 명시되어 있습니다.
특정 기준이 충족되면 복사 / 이동 작업을 위해 선택한 생성자 및 / 또는 객체에 대한 소멸자가 부작용이 있더라도 구현시 클래스 객체의 복사 / 이동 구성을 생략 할 수 있습니다 . [...]