「as-if」ルールとは何ですか?
「as-if」ルールは基本的に、実装が正当なC ++プログラムで実行できる変換を定義します。つまり、プログラムの「監視可能な動作」(正確な定義については以下を参照)に影響を与えないすべての変換が許可されます。
目標は、プログラムの動作が抽象マシンに関してC ++標準で指定されたセマンティクスに準拠している限り、最適化を実行する自由を実装に与えることです。
標準はこのルールをどこに導入しますか?
C ++ 11標準では、1.9 / 1項に「as-if」ルールが導入されています。
この国際標準の意味論的記述は、パラメータ化された非決定論的な抽象マシンを定義しています。この国際規格では、準拠する実装の構造に要件はありません。特に、抽象マシンの構造をコピーまたはエミュレートする必要はありません。むしろ、以下で説明するように、抽象マシンの観察可能な動作を(のみ)エミュレートするには、準拠する実装が必要です。
また、説明用の脚注には以下が追加されています。
この規定は、「as-if」ルールと呼ばれることもあります。これは、観察可能な動作から判断できる限り、実装は、結果が要件に従っているかのようである限り、この国際規格の要件を自由に無視できるためです。プログラムの。たとえば、実際の実装では、その値が使用されておらず、プログラムの観察可能な動作に影響を与える副作用がないことが推定できる場合、式の一部を評価する必要はありません。
ルールは正確に何を義務付けていますか?
1.9 / 5項では、さらに次のことを指定しています。
整形式プログラムを実行する適合実装は、同じプログラムと同じ入力を持つ抽象マシンの対応するインスタンスの可能な実行の1つと同じ観察可能な動作を生成します。ただし、そのような実行に未定義の操作が含まれている場合、この国際標準では、その入力を使用してそのプログラムを実行する実装に要件はありません(最初の未定義の操作の前の操作についても同様)。
この制約は「整形式プログラムの実行」時にのみ適用され、未定義の動作を含むプログラムを実行した場合の結果には制約がないことを強調しておきます。これは、1.9 / 4項でも明示されています。
他の特定の操作は、この国際標準では未定義として記述されています(たとえば、constオブジェクトを変更しようとした場合の影響)。[注:この国際規格は、未定義の動作を含むプログラムの動作に要件を課していません。—エンドノート]
最後に、「観察可能な行動」の定義に関して、1.9 / 8項は次のようになります。
適合実装の最小要件は次のとおりです。
—揮発性オブジェクトへのアクセスは、抽象マシンのルールに従って厳密に評価されます。
—プログラムの終了時に、ファイルに書き込まれたすべてのデータは、抽象的なセマンティクスに従ってプログラムを実行した場合に生じる可能性のある結果の1つと同一でなければなりません。
—対話型デバイスの入力と出力のダイナミクスは、プログラムが入力を待機する前にプロンプト出力が実際に配信されるような方法で行われる必要があります。インタラクティブデバイスを構成するものは、実装によって定義されます。
これらをまとめて、プログラムの観察可能な動作と呼びます。[ 注:抽象と実際のセマンティクス間のより厳密な対応は、各実装によって定義される場合があります。— エンドノート ]
このルールが適用されない状況はありますか?
私の知る限りでは、「as-if」ルールの唯一の例外はコピー/移動省略です。これは、クラスのコピーコンストラクター、移動コンストラクター、またはデストラクタに副作用がある場合でも許可されます。これの正確な条件は、12.8 / 31項で指定されています。
特定の基準が満たされると、コピー/移動操作用に選択されたコンストラクターやオブジェクトのデストラクタに副作用がある場合でも、実装はクラスオブジェクトのコピー/移動構成を省略できます。[...]