1

这是一个简单的代码

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”成员。

除了关闭代码特定部分的优化之外,有没有办法解决这个问题?例如 volatile 说明符等技巧。

4

1 回答 1

2

这已经被优化器假设了,所以你不能告诉它假设它已经假设的东西。

但是,如果您认为您正在更改值,但实际上正在遇到未定义的行为(例如,因为您m通过类型双关指针进行修改或union滥用),那么优化器完全可以假设m没有更改。最好的解决办法当然是删除那个 UB,或者(如果失败了)至少对优化器隐藏它。

于 2013-04-23T15:18:33.600 回答