优化器删除指针取消引用行
Optimizer removing pointer de-reference lines
我有一个问题,优化器似乎正在删除非常必要的代码行。一些背景:我有一个连接 PCIe 驱动程序的程序。我有一个整数指针UINT32 *bar_reg;
指向我正在与之通信的 BAR 寄存器的用户空间地址。要写入寄存器,我只需取消引用指针。 *(bar_reg + OFFSET) = value;
在没有优化的情况下,这工作正常。但是,一旦我打开任何级别的优化,所有取消引用指针的行都会被删除。我最终发现这一点的方式是通过Visual Studio逐步完成。但是,它独立于平台而发生。到目前为止,我已经能够在优化器关闭的情况下过得去,但是有人在 Linux 中使用我的库代码想要现在打开优化。所以我很好奇为什么会出现这个问题以及最合理的修复/解决方法是什么。
使用volatile
关键字以防止优化该变量。
例如:
volatile UINT32 *bar_reg;
这里的问题是编译器假设由于程序不访问内存,那么这意味着内存将保持不变,因此它可能会尝试优化对该内存的某些写入。
您遇到的问题涉及 as-if 规则,该规则允许优化器以任何方式转换您的代码,只要它不会影响程序的可观察行为。
因此,如果您只写入变量,但从未在程序中实际使用,则优化器认为没有可观察到的行为,并假设它可以有效地优化写入。
在您的情况下,数据是在程序外部观察到的,并且向编译器和优化器指示这一点的方法是通过易失性限定符,cpp首选项告诉我们(强调我的):
类型为可变限定的对象,或 易失性对象,或常量易失性对象的可变子对象。 每次访问(读取或写入操作、成员函数调用等) 易失性对象被视为 优化目的 [...]
作为参考,C++标准草案第1.9
节中涵盖了假设规则,其中规定:
[...]相反,需要符合要求的实现来模拟(仅) 抽象机器的可观察行为,如下所述。
关于假设规则,挥发性也包含在第1.9
节中,它说:
对易失性对象的访问严格按照 抽象机器的规则。
- C++取消引用指针.为什么会发生变化
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- 取消引用运算符不能重载
- 在他自己的方法中,有可能将一个对象取消引用到另一个对象吗
- C++ 关于指针取消引用的技术问题
- 没有取消引用/解包对象的标准方法?
- 列表 iter 不取消引用 使用列表进行插入排序
- 在这个函数中是有缺陷的,因为取消引用 null 是无效的,所以我想更改代码
- 取消引用结束指针到数组类型的一个
- 取消引用向量时出现问题
- 取消引用指向整数的指针时获得不同的结果
- C++:取消引用十六进制值,有点语法问题
- C/C++ 取消引用错误:在空检查之前取消引用
- 取消引用后C++空测试
- 立即取消引用unique_ptr
- 如何在不使用临时变量的情况下取消引用返回指针的函数的返回值?
- 取消引用 void 指针以将值分配给结构
- boost_multi_index迭代器取消引用给出常量
- 为什么"std::uninitialized_copy"通常取消对未初始化内存的迭代器的引用不是未定
- 矢量迭代器不能与 std::shared_ptr<> 取消引用