告诉gcc优化器在全局函数中改变了值

时间:2013-04-23 14:09:07

标签: c++ gcc

这是一个简单的代码

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

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

1 个答案:

答案 0 :(得分:2)

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

但是,如果您认为您正在更改该值,但实际上正在达到未定义的行为(例如,因为您通过类型惩罚指针修改m,或{{1滥用),然后优化器完全有权假设union没有改变。最好的修复当然是删除UB,或者(失败)至少将它从优化器中隐藏起来。