来自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节
具有易失性限定类型的对象可以以实现未知的方式进行修改,或者具有其他未知的副作用。因此,引用这样一个对象的任何表达式都必须严格按照抽象机器的规则进行计算。
有矛盾吗?如果是这样的话,PCS与C标准的矛盾又是如何成立的呢?
发布于 2019-10-19 18:02:13
因此,我到达了ARM工具链的支持组,根据它们,ARM PCS标准是一个独立的标准,不受C标准的约束,因此编译器可以选择遵守其中一个标准或两者。用他们自己的话说:
在某种程度上这并不是一个矛盾
因此,与两者兼容的编译器将尊重本地易失性。
Armclang选择遵循C标准,这使得它与两者兼容。
因此,如果编译器选择执行这种不符合C的优化,那么它仍然是ARM PCS一致性实现,而不是符合C的编译器。
总之,实现ARM PCS的ARM体系结构的C兼容编译器永远不会执行这种优化。
https://stackoverflow.com/questions/57933921
复制相似问题