【问题标题】:When are const volatile objects necessary?什么时候需要 const volatile 对象?
【发布时间】:2013-08-14 04:28:35
【问题描述】:

什么时候在 C++ 中需要 const volatile 对象?

注意: 我确实理解需要 指针 指向 const volatile 内存位置,但这些并不要求对象本身是 const 或 @987654325 @.
我询问的是某些const volatile 类型的自身 对象,例如:

const volatile T obj;

这些在哪些情况下是必要的或有用的?

【问题讨论】:

  • @IgorTandetnik:这些不会映射到内存地址吗?也就是说,您不需要构造指向const volatile 类型对象的指针,而不是自己创建const volatile 对象吗?
  • 您可以告诉链接器您希望将某些变量放在哪里。当您使用一些特殊的编译器时,它们允许直接将地址注释到变量中,从而无需使用指针来引入对 const volatile 对象的需求。
  • @aaronman:是的,但 C++03 也从未打算让您使用 volatile 进行并发,对吧?
  • @aaronman:不,volatile 从未与线程有任何关系,而且可能永远不会。我不认为 C++11 有什么改变,但如果你能告诉我,我很想知道。

标签: c++ constants volatile


【解决方案1】:

在 c++ 中实际需要 volatile 的情况很少见。 volatile 不再对多线程有用。从this website 开始,只有三种可移植 volatile 使用。

Hans Boehm 指出 volatile 只有三种便携式用途。我将在这里总结它们:

  1. 在 setjmp 范围内标记局部变量,以便该变量在 longjmp 后不会回滚。
  2. 内存被外部代理修改或似乎是由于内存映射错误
  3. 信号处理程序恶作剧

所以基本上你只想将其他特性用于并发编程,并为那些罕见的情况保存 volatile

【讨论】:

  • Alexandrescu 的cool trick back in 2001 怎么样? TL;DR:volatile 可以重载类方法,以提供几乎透明的胎面安全性。
  • 就是在c++11之前意思有点变化
  • @DanielKO 我引用的文章完全不同意你的文章,也是一位受人尊敬的开发人员,我认为 volatile 的问题在于它的实现定义太高,标准没有足够好地指定它。我实际上在question 中使用了 volatile 关键字,我问过,人们似乎认为它不会提供一致的行为
  • 你的也是 C++11 之前的,那又怎样?在 Alexandrescu 的文章中使用 volatile 与在原始类型上使用 volatile 无关。在用户定义的类型上,它只是一个“免费”的类型限定符,您可以使用它来滥用类型系统。这个想法是使对象“易变”,现在用户无法在不明确地将volatile 强制转换的情况下访问线程不安全方法(没有volatile);然后提供一种自动构造unique_lock 的“非易失性”方法。任何破坏线程安全的尝试都会令人讨厌(const_cast)。我认为这些规则根本没有改变。
  • 我开玩笑地说“虐待”。它采用了 C++ 类型系统的其他无用机制来强制访问权限;默认情况下,您会获得“最低级别”(使用volatile),并且类型系统不会删除限制,直到您明确这样做。根据“级别”,您可以访问不同的操作;它与“const”方法没有什么不同,只是传播范围较小。它至少值得“第四次”便携使用,即使与并发性没有直接关系。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-16
  • 2019-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多