来自ARM体系结构的过程调用标准(§7.1.5):
编译器可能会忽略自动变量的易失性限定除非函数调用,否则其地址永远不会被占用的变量setjmp()。
这意味着在以下代码中:
volatile int x = 8;
if (x == 1)
{
printf("can be optimised away??");
}
整个if
范围可以优化吗?
这只是与标准相矛盾,对于初学者来说,易失性访问是可观察到的行为的一部分,必须像抽象机器代码中那样执行:
§5.1.2.3:
对合规实现的最低要求是:
严格按照抽象机的规则。
还有§6.7.3:
具有volatile限定类型的对象可以通过以下方式修改实现未知或具有其他未知副作用。因此任何引用此类对象的表达式为严格按照抽象机的规则进行评估]
有矛盾吗?如果是这样,PCS与C标准相抵触的合法性如何?
从某种意义上说,这并不是真正的矛盾APCS允许编译器尊重或忽略本地易失性
- C标准要求编译器遵守本地易失性
因此,与两者兼容的编译器将遵守本地易失性。 [Armclang已选择遵循C标准,这使其与两者兼容
因此,如果编译器选择执行此不符合C的优化,则它仍然是符合ARM PCS的实现,而不是符合C的编译器。
最后,实现ARM PCS的用于ARM体系结构的C兼容编译器将永远不会执行此优化。