問題タブ [as-if]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - ストアの並べ替えは C++ as-if ルールで許可されていますか?
「as-if」ルールは基本的に、実装が正当な C++ プログラムで実行できる変換を定義します。つまり、プログラムの観察可能な動作に影響を与えないすべての変換が許可されます。
「観察可能な動作」が正確に何を表しているかについては、cppreference.comは、 input/output に関して、標準によって与えられたものとは異なる定義を持っているようです。それが標準の再解釈なのか、それとも間違いなのかはわかりません。
cppreference.com による" as-if " ルール:
- すべての入力操作と出力操作は、プログラムが記述どおりに実行された場合と同じ順序で同じ内容で発生します。
標準による" as-if " ルール:
- 対話型デバイスの入力と出力のダイナミクスは、プログラムが入力を待機する前にプロンプト出力が実際に配信されるような方法で行われます。対話型デバイスを構成するものは実装定義です
通常のストアの並べ替えが有効なコンパイラの最適化であるかどうかを知りたいので、この違いは私にとって重要です。cppreference の文言によると、メモリ ストアはoutput operations
それに属する必要があります。しかし、標準によると、メモリストアはそうではないようですthe output dynamics of interactive devices
。(そもそもインタラクティブデバイスとは何ですか?)
従うべき例。
最新のコンパイラは、 function に対して次のコードを生成する場合がありfoo
ます。
ご覧のように、ストア to はストア toA
で並べ替えられB
ます。「 as-if」ルールに準拠していますか? この種の並べ替えは標準で許可されていますか?
c++ - for ループ条件での定数の評価
この例ではmy_function(MY_CONSTANT)
、各反復で評価されますか、それとも自動的に保存されますか? これは、使用する最適化フラグに依存しますか?
c++ - 実行時間がゼロのループ
実行時間がゼロのループを持つことは可能ですか? それに関連するオーバーヘッドがあるため、空のループでも実行時間が必要だと思います。
c++ - as-if ルールと割り当ての削除
「as-if ルール」は、次のような特定のルールの下でプログラムの出力と正確性に違いをもたらさない式を最適化または再順序付けする権利をコンパイラに与えます。
§1.9.5
整形式プログラムを実行する適合実装は、同じプログラムと同じ入力を使用した抽象マシンの対応するインスタンスの可能な実行の 1 つと同じ観測可能な動作を生成するものとします。
上記でリンクした cppreference url は、C++ 14 での volatile オブジェクトの値と「新しい式」の特別な規則について具体的に言及しています。
new-expression には、as-if ルールからの別の例外があります。コンパイラは、ユーザー定義の置換が提供され、観察可能な副作用がある場合でも、置換可能な割り当て関数への呼び出しを削除する場合があります。
ここで「交換可能」とは、たとえば
§18.6.1.1.2
置換可能: C++ プログラムは、C++ 標準ライブラリによって定義された既定のバージョンを置き換えるこの関数シグネチャを使用して関数を定義できます。
mem
as-if ルールの下で以下を削除または並べ替えることができる というのは正しいですか?
削除されず、コードの上部ブロックと下部ブロックの間に留まるようにする方法はありますか? 適切に配置された volatile (/または volatile std::array または auto の左側) が頭に浮かびますが、 の読み取りがないため、それでさえas-ifルールmem
の下では役に立たないと思います。
サイドノート; mem
Visual Studio 2015 を最適化して割り当てを行うことができませんでした。
明確化: これを観察する方法は、OS への割り当て呼び出しが 2 つのブロックからの i/o の間に来ることです。これのポイントは、テストケースのため、および/またはオブジェクトを新しい場所に割り当てようとすることです。