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

Tell gcc optimizer that value is changed in global function

本文关键字:函数 改变 全局 gcc 优化 告诉      更新时间:2023-10-16

下面是一段简单的代码

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优化器抛出所有AsValue()代码除了"返回m",因为,我想,它没有看到GlobalAlterA()体,不知道AlterA()可以改变"m"成员。

是否有一种方法来解决这个问题,除了关闭优化的特定部分的代码?例如,像volatile说明符等技巧

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

然而,如果你认为改变了值,但实际上却遇到了未定义行为(例如,因为你通过类型双关指针修改了m,或者union滥用),那么优化器就有权利假设m没有改变。最好的解决方法当然是删除该UB,或者(如果做不到这一点)至少对优化器隐藏它。