“ as-if 规则”赋予编译器优化或重新排序表达式的权利,这些表达式在某些规则下不会影响程序的输出和正确性,例如:
§1.9.5
执行格式良好的程序的一致实现应产生与具有相同程序和相同输入的抽象机的相应实例的可能执行之一相同的可观察行为。
我在上面链接的 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
下也无济于事。
边注; 我根本无法让 Visual Studio 2015 优化mem
和分配。
澄清:观察这一点的方法是对操作系统的分配调用来自两个块的任何 i/o。这样做的目的是针对测试用例和/或尝试在新位置分配对象。