c++ - 使用 "pointer to volatile"是否始终阻止编译器优化?

标签 c++ volatile

这里是问题所在:your program temporarily uses some sensitive data and wants to erase it when it's no longer needed .使用 std::fill() 本身并不总是有帮助 - 编译器可能会决定以后不会访问内存块,因此删除它是浪费时间并消除删除代码。

User ybungalobill建议 using volatile keyword :

{
  char buffer[size];
  //obtain and use password
  std::fill_n( (volatile char*)buffer, size, 0);
}

目的是在看到 volatile 关键字时,编译器将不会尝试消除对 std::fill_n() 的调用。

volatile 关键字是否总是会阻止编译器消除此类内存修改代码?

最佳答案

编译器可以自由地优化您的代码,因为buffer 不是 volatile 对象

该标准仅要求编译器严格遵守可变对象的语义。这是 C++03 所说的

The least requirements on a conforming implementation are:

  • At sequence points, volatile objects are stable in the sense that previous evaluations are complete and subsequent evaluations have not yet occurred. [...]

The observable behavior of the abstract machine is its sequence of reads and writes to volatile data and calls to library I/O functions

在您的示例中,您拥有的是使用 volatile 左值对非 volatile 对象进行读写。 C++0x 删除了我上面引用的第二个文本,因为它是多余的。 C++0x 只是说

The least requirements on a conforming implementation are:

  • Access to volatile objects are evaluated strictly according to the rules of the abstract machine.[...]

These collectively are referred to as the observable behavior of the program.

虽然有人可能会争辩说“ volatile 数据”可能意味着“ volatile 左值访问的数据”,这仍然很牵强,但 C++0x 的措辞消除了对您的代码的所有疑虑,并明确允许实现对其进行优化离开。

但正如人们向我指出的那样,这在实践中可能并不重要。优化此类事情的编译器很可能会违背程序员的意图(否则为什么有人会有指向 volatile 的指针),因此可能包含错误。尽管如此,我还是遇到过一些编译器供应商,他们在遇到有关其过度优化的错误报告时引用了这些段落。最后,volatile 是特定平台固有的,无论如何您都应该仔细检查结果。

关于c++ - 使用 "pointer to volatile"是否始终阻止编译器优化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3785798/

相关文章:

c++ - 将特定字符移动到字符串末尾的递归 C++ 函数

c++ - 向客户端隐藏库内部类 C++ : use friend?

c++ - 最大化平面值中的点

c++ - 将双指针转换为 int 指针

c++ - GCC 8 无法编译 make_shared<volatile int>()

C 在头文件中使 volatile sig_atomic_t 全局化

c++ - 之前未调用函数时出错

C# ThreadStatic + volatile 成员未按预期工作

java - 使用双重检查锁定,对 volatile ConcurrentHashMap 的 put 是否有 happens-before 保证?

java - Java中synchronized/volatile的变量可见性影响到什么程度