优化器删除指针去参考线

时间:2014-11-21 22:59:09

标签: c++ pointers optimization

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

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

2 个答案:

答案 0 :(得分:6)

使用volatile关键字来阻止优化该变量。

例如:

volatile UINT32 *bar_reg;

这里的问题是编译器假定由于程序不访问内存,这意味着内存将保持不变,因此可能会尝试优化对该内存的一些写入。

答案 1 :(得分:2)

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

因此,如果您只写入变量但从未在程序中实际使用,则优化器认为没有可观察的行为,并假设它可以有效地优化写入。

在你的情况下,数据是在你的程序之外被观察的,并且向编译器和优化器指示这个数据的方式是通过volatile限定符,cppreference告诉我们(强调我的转发):

  

类型为volatile-qualified的对象,或者是a的子对象   volatile对象,或const-volatile对象的可变子对象。   每次访问(读取或写入操作,成员函数调用等)   挥发性物体被视为可见的副作用   优化目的 [...]

作为参考, as-if规则1.9部分的C ++标准草案中有所说明:

  

[...]相反,符合要求的实施需要模仿(仅)   抽象机器的可观察行为,如下所述。

并且关于 as-if规则 volatile也在1.9部分中介绍,它说:

  

严格按照标准评估对易失性对象的访问   抽象机器的规则。