这是一个简单的代码
void GlobalAlterA(A *a) { a->m = 1; }
struct A { int n, int m; };
struct Z: public A { void AlterA() { GlobalAlterA(this); } };
struct Y: public Z {};
struct X: public Y
{
int AsValue()
{
switch (n)
{
case 0: return m;
default: AlterA(); return m;
}
}
};
现在,这段代码的问题是gcc优化器会抛弃除“return m”之外的所有AsValue()代码,因为我认为它没有看到GlobalAlterA()体并且不知道AlterA()可以改变“m”成员。
除了关闭特定代码部分的优化外,有没有办法解决这个问题?例如。像易失性说明符等技巧
答案 0 :(得分:2)
优化器已经假设了这一点,所以你不能告诉它假设它已经假设的东西。
但是,如果您认为您正在更改该值,但实际上正在达到未定义的行为(例如,因为您通过类型惩罚指针修改m
,或{{1滥用),然后优化器完全有权假设union
没有改变。最好的修复当然是删除UB,或者(失败)至少将它从优化器中隐藏起来。