【问题标题】:Why can a volatile type be constant when returned by a constant functions?当常量函数返回时,为什么 volatile 类型可以是常量?
【发布时间】:2014-08-24 08:59:32
【问题描述】:

一个c++类有一个成员函数,代码如下:

const volatile stats_t& get_stats() const{
        return stats;
    }

同时使用 const 和 volatile 的原因是什么?这个功能究竟实现了什么?如果返回类型是 const,使用 volatile 是不是与其目的相矛盾?

【问题讨论】:

  • 在 C++ 中 const 表示 read-only,并不是说它永远不会改变。所以变量可以被外部因素改变,但不能被你的程序改变。

标签: c++ function constants volatile


【解决方案1】:

constvolatile不相反

将某事标记为const 表示“这不会被这段代码修改,它是一个常量值/指针/任何东西”

标记为volatile的意思是“不要缓存这个值,它可能会被外部IO操作、中断或其他东西突然改变”

它们有不同的用途。 const 更像是“代码不要修改规则”,而 volatile 更像是“缓存、重新排序和编译器优化规则

【讨论】:

    【解决方案2】:

    一种可能的情况是,您有一个读取统计信息的主线程和一个更新统计信息的辅助线程。因此,主线程想要“获取”统计信息以了解它们的存储位置。这将是const,因为我们不希望主线程修改统计信息,还有volatile,因为辅助线程定期更新统计信息[当然,该值不是 const]。

    函数后面的const 仅表示this 是函数中的const 指针(换句话说,我们不会在调用该特定函数时更改对象的内容)。

    当然,如果stats_t 实际上是一个指向硬件中一些有趣寄存器的指针,那么同样的情况也适用,这些寄存器会被硬件更新。编译器无法知道它们何时/如何更新,因此不能“假设它永远不会改变,除非调用函数”。

    编辑:但是请注意,volatile 绝对不能保证多线程环境中的线程和操作的正确性。这仅意味着编译器不会优化对变量的访问,因为它已经在较早的时候读取了该值。为了保证线程的行为,你确实需要原子操作或锁[这是一个相当复杂的主题,我可能会在这个主题上写几页,而专家最终可能会写一整本书]

    【讨论】:

    • volatile 不是线程解决方案,std::atomic 更好。 volatile 真的是硬件。
    • 嗯,可能。完全取决于内容是什么,您如何处理它等。但我会在您所说的效果上添加一些内容。