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

时间:2014-08-24 08:59:33

标签: c++ function const volatile

c ++类的成员函数包含以下代码:

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

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

2 个答案:

答案 0 :(得分:9)

constvolatile

不相反

将某些内容标记为const意味着"这不会被这段代码修改,它是一个常量值/指针/无论什么"

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

它们用于不同的目的。 const更像是一个" 代码不要修改规则"易变的" 缓存,重新排序和编译器优化规则"

答案 1 :(得分:2)

可能的情况是你有一个主线程,读取统计数据,以及一个更新统计数据的辅助线程。因此,主线程想要"得到"统计数据,以了解它们的存储位置。这将是const,因为我们不希望主线程修改统计信息,还要volatile,因为统计信息正在由辅助线程定期更新[当然,其中,值不是常量]。

函数之后的const只意味着this是函数中的const指针(换句话说,我们不会在对该特定的调用中更改对象的内容功能)。

当然,如果stats_t实际上是指向硬件中的某些有趣寄存器的指针,则会应用相同的方案。编译器无法知道它们何时/如何更新,因此不得假设它永远不会改变,除非调用函数"。

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