为什么volatile类型在由常量函数返回时可以是常量?

Why can a volatile type be constant when returned by a constant functions?

本文关键字:常量 返回 函数 volatile 类型 为什么      更新时间:2023-10-16

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

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

const和volatile同时使用的原因是什么?这个函数到底实现了什么?如果返回类型是const,它是否与使用volatile的目的相矛盾?

const不与volatile相反

标记为const意味着"这不会被这段代码修改,它是一个常量/指针/什么的"

将某些内容标记为volatile意味着"不要缓存此值,它可能会突然被外部IO操作,中断或其他东西更改"

它们有不同的用途。Const更多的是一个"代码不修改规则",而volatile是一个"缓存、重新排序和编译器优化规则"

一种可能的情况是,您有一个主线程,读取统计数据,一个副线程更新统计数据。因此,主线程会想要"获取"统计数据,以知道它们存储在哪里。这可能是const,因为我们不希望主线程修改统计数据,但也可能是volatile,因为统计数据正在由二级线程定期更新[当然,其中的值不是const]。

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

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

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