告诉gcc优化器值在全局函数中改变了
Tell gcc optimizer that value is changed in global function
下面是一段简单的代码
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,或者(如果做不到这一点)至少对优化器隐藏它。
相关文章:
- 变量没有改变?通过向量的函数调用
- 为什么提升图库的 read_graphviz() 函数会改变节点的索引
- 为什么我的函数接受"std::string"进行排序不会改变它?
- 通过从构造函数中的'this'复制的指针改变常量对象
- 为什么我可以改变常量对象中的成员变量,这是返回常量对象函数的结果?
- 有没有办法创建一个不改变程序中参数的函数
- 为什么我的函数不改变对象的属性
- 类中的枚举在调用自己的函数时不会改变
- C - 如何将各处的静态函数称为改变其私有变量
- 基于继承的类型参数改变父虚拟函数的行为
- 对列表中的每个对象调用成员函数,以改变对象所在的列表
- 为什么调用 CUDA 内核函数时这个类成员变量没有改变
- 当函数应该改变对象的状态时,是选择成员函数还是朋友函数
- 一个什么都不做的函数可以改变一个对象吗?
- ifstream 函数"get"如何改变其字符参数?
- 为什么一个函数的末尾有常量这个词,即使它确实改变了一个变量
- visual C++未执行的代码会改变函数行为
- 不被类函数改变的私有int值
- 谷歌模拟函数改变参数值
- 被非const成员函数改变的可变变量