为什么volatile类型在由常量函数返回时可以是常量?
Why can a volatile type be constant when returned by a constant functions?
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
并不能保证线程和操作在多线程环境中的正确性。这只意味着编译器不会优化对变量的访问,因为它已经在某个较早的点读取了该值。为了保证线程行为,您确实需要原子操作或锁[这是一个相当复杂的主题,我可能会在这个主题上写好几页,专家可能会写一整本书]
相关文章:
- 什么时候在C++中返回常量引用是个好主意
- 为什么我可以通过引用修改常量返回
- 返回常量对象引用 (getter) 和仅返回字符串有什么区别?
- 为什么 STL 容器适配器堆栈中的 top 返回常量引用?
- 如何返回向量的常量引用?
- C++ 获取函数在常量引用中按值返回的结果
- NVCC 错误:string_view.h:constexpr 函数返回是非常量
- 是否可以跨 dll 边界返回常量引用/指向 std::vectors?
- 为什么常量返回防止:(A1 = A2) = A3?
- 为什么我可以改变常量对象中的成员变量,这是返回常量对象函数的结果?
- PyBind11:返回对 std::vector of std::unique_ptr 的常量引用
- 如何为具有常量类型的函数正确转换来自 DLsym 的返回值?
- 返回对常量结构(指针类型)成员的引用:明显的左值到右值转换
- 如何在另一个成员函数中修改具有常量返回类型的成员函数的返回值
- 一种创建将字符串常量返回给枚举的类的廉价方法,反之亦然
- 重载运算符:常量与非常量返回类型:任何性能差异
- 常量 T * 搜索 ( 常量 T &) 返回不起作用
- 常量返回类型在 NRVO 案例中的相关性
- 函数常量返回类型:类型引用的初始化无效
- 后缀自增运算符的常量返回类型