打印
[经验分享]

不要过度使用 volatile,可能会导致性能下降。

[复制链接]
512|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
qsrg51|  楼主 | 2023-8-20 15:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式


volatile 是一个在编程中用于修饰变量的关键字,它在不同编程语言中可能有些微的差异,但通常用于指示编译器不要对带有 volatile 修饰的变量进行优化,以确保变量的读写操作不被过度优化或重排。

在C和C++语言中,volatile 关键字的主要作用是告诉编译器不要对被声明为 volatile 的变量进行优化,因为这些变量可能会在程序的其他地方被外部因素改变。具体来说,volatile 的作用有以下几点:

使用特权

评论回复
沙发
qsrg51|  楼主 | 2023-8-20 15:56 | 只看该作者
禁止优化:编译器在对代码进行优化时,可能会将一些读写操作进行重排或省略,以提高代码的执行效率。但是,对于被声明为 volatile 的变量,编译器不会对其进行这样的优化,以免改变其原有的读写顺序。

使用特权

评论回复
板凳
qsrg51|  楼主 | 2023-8-20 15:56 | 只看该作者
防止缓存优化:现代计算机通常会在处理器内部使用缓存来提高内存访问速度。然而,某些情况下,这种缓存可能会导致变量的更新不及时,因为变量的改变可能仅在内存中而不是缓存中。使用 volatile 可以告诉编译器不要过度使用缓存,以确保变量的读写操作始终与内存中的实际状态保持一致。

使用特权

评论回复
地板
qsrg51|  楼主 | 2023-8-20 15:56 | 只看该作者
多线程同步:在多线程编程中,一个线程可能会修改一个变量的值,而另一个线程可能会读取这个变量的值。如果不使用适当的同步机制,编译器可能会优化掉一些看似无效的读写操作,从而导致多线程程序的错误行为。使用 volatile 可以确保编译器不会对这些操作进行优化,从而避免潜在的多线程问题。

使用特权

评论回复
5
qsrg51|  楼主 | 2023-8-20 15:56 | 只看该作者
注意volatile 并不能解决所有的多线程同步问题,它只是保证变量的读写操作不被过度优化。对于更严格的多线程同步需求,通常需要使用更高级的同步机制,如互斥锁(mutex)和条件变量(condition variable)等。

使用特权

评论回复
6
qsrg51|  楼主 | 2023-8-20 15:56 | 只看该作者
volatile 关键字用于指示编译器不要对变量进行优化,主要适用于多线程环境或与外部因素有关的变量。在其他情况下,一般不需要过度使用 volatile,因为它可能会导致性能下降。

使用特权

评论回复
7
tpgf| | 2023-9-11 12:16 | 只看该作者
volatile是一个特征修饰符.volatile的作用是作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值

使用特权

评论回复
8
heimaojingzhang| | 2023-9-11 13:08 | 只看该作者
volatile应该解释为"直接存取原始内存地址"比较合适,"易变的"这种解释简直有点误导人

使用特权

评论回复
9
keaibukelian| | 2023-9-11 19:00 | 只看该作者
当要求使用volatile 声明的变量的值的时候,系统总是重新从它所在的内存读取数据,即使它前面的指令刚刚从该处读取过数据。而且读取的数据立刻被保存

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

50

主题

364

帖子

1

粉丝