2014-11-21 46 views
5

我有一个问题,优化器似乎是删除非常必要的代码行。一些背景:我有一个连接PCIe驱动程序的程序。我有一个整数指针UINT32 *bar_reg;,它指向我要通信的BAR寄存器的用户空间地址。要写入寄存器,我只需取消引用指针。 *(bar_reg + OFFSET) = value;优化器删除指针去参考线

没有优化,这工作正常。然而,只要我打开任何级别的优化,所有取消引用指针的行都会被删除。我终于发现这一点的方式是通过在Visual Studio中加入。然而,它独立于平台而发生。到目前为止,我已经能够关闭优化器,但是在Linux中使用我的库代码的人现在想要打开优化。所以我很好奇为什么会出现这个问题,以及最合理的解决方法/解决方法是什么。

+0

优化的代码行为不同通常是由于未定义的行为。 – 2014-11-23 03:28:38

回答

6

使用volatile关键字为了防止该变量的优化。

例如:

volatile UINT32 *bar_reg; 

这里的问题是,编译器假定,因为内存不被程序访问,那么就意味着该内存将保持不变,因此它可能会试图优化一些的写入内存。

2

您遇到的问题涉及as-if rule,它允许优化程序以任何方式转换您的代码,只要它不影响程序的可观察行为即可。

因此,如果您只写入变量但永远不会在您的程序中实际使用,那么优化程序认为没有可观察到的行为并假定它可以有效地优化写入。

在你的情况下,数据被你的程序为表示该编译器和优化的方式之外观测是通过volatile预选赛,cppreference告诉我们(重点煤矿要forwrd):

对象的类型是易失性限定的,或子对象是易失性对象,或者是易失性对象的可变子对象。 每个访问(读或写操作,成员函数调用等)上 挥发性对象被作为 目的的优化 [...]

作为参考可见副作用处理所述作为-如果规则被覆盖在部分1.9草案C++标准,该标准表示:

[...]相反,符合实现是模拟(仅) 的OB所需如下面解释的抽象机器的可操作行为

,并对于为,如果规则挥发性也包括在部分1.9和它说:

访问volatile对象进行评估,严格按照抽象机的 规则。