【问题标题】:What is the purpose of the const_cast<> on a volatile?volatile 上的 const_cast<> 的目的是什么?
【发布时间】:2010-06-12 22:43:46
【问题描述】:

我看到有可能这样做,但我不明白它的兴趣。

【问题讨论】:

  • 您是在询问从const volatile 转换为volatile 还是其他什么?
  • 了解了一些关于使用 const_cast 进行的 volatile 转换的新知识,并将我不小心偏离主题(但相关)的答案移到了 const_casting 的有效场景:hostilefork.com/2010/06/12/…

标签: c++ casting standards volatile


【解决方案1】:

constvolatile 听起来好像它们在变量上引用了相同的想法,但实际上并非如此。当前代码无法更改const 变量。 volatile 变量可能会被当前代码之外的某些外部实体更改。可能有一个const volatile 变量——尤其是像内存映射寄存器这样的变量——在你的程序无法预测的时候被计算机更改,但你的代码不允许直接更改。您可以使用const_cast 向变量添加或删除constvolatile(“cv-qualification”)。

【讨论】:

    【解决方案2】:

    constvolatile 是正交的。

    const 表示数据是只读的。

    volatile 表示变量可能由于外部原因而发生变化,因此编译器需要在每次引用时从内存中读取变量。

    因此删除const 允许您编写原本只读的位置(代码必须具备一些特殊知识,该位置实际上是可修改的)。您不应该删除 volatile 来编写它,因为您可能会导致未定义的行为(由于 7.1.5.1/7 - If an attempt is made to refer to an object defined with a volatile-qualified type through the use of an lvalue with a non-volatile-qualified type, the program behaviour is undefined.

    【讨论】:

    • const_cast 适用于constvolatile,虽然删除volatile 可能会导致未定义的行为,但在某些情况下它不会。 IE。添加内存屏障将强制编译器不缓存变量,并提供更强大的保证volatile(不仅变量不会被缓存,而且它的指令不会在临界区之外重新排序)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-25
    • 2021-04-03
    • 2011-03-26
    • 2015-05-24
    • 2021-11-15
    • 1970-01-01
    • 2016-11-05
    相关资源
    最近更新 更多