「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 ルールの下で以下を削除または並べ替えることができる というのは正しいですか?
{
... some conformant code // upper block of code
auto mem = std::make_unique<std::array<double, 5000000>>();
... more conformant code, not using mem // lower block of code
}
削除されず、コードの上部ブロックと下部ブロックの間に留まるようにする方法はありますか? 適切に配置された volatile (/または volatile std::array または auto の左側) が頭に浮かびますが、 の読み取りがないため、それでさえas-ifルールmem
の下では役に立たないと思います。
サイドノート; mem
Visual Studio 2015 を最適化して割り当てを行うことができませんでした。
明確化: これを観察する方法は、OS への割り当て呼び出しが 2 つのブロックからの i/o の間に来ることです。これのポイントは、テストケースのため、および/またはオブジェクトを新しい場所に割り当てようとすることです。