为了账号安全,请及时绑定邮箱和手机立即绑定

请问为什么挥发性存在?

请问为什么挥发性存在?

C++
喵喔喔 2019-12-02 08:04:51
什么是volatile关键词呢?在C ++中,它可以解决什么问题?就我而言,我从来没有故意需要它
查看完整描述

3 回答

?
米琪卡哇伊

TA贡献1998条经验 获得超6个赞

volatile 如果要从内存中某个完全是独立的进程/设备/进行任何写入的位置读取数据,则需要使用此命令。


我曾经在直接C语言的多处理器系统中使用双端口ram。我们使用硬件管理的16位值作为信号量来了解其他人何时完成。本质上,我们这样做:


void waitForSemaphore()

{

   volatile uint16_t* semPtr = WELL_KNOWN_SEM_ADDR;/*well known address to my semaphore*/

   while ((*semPtr) != IS_OK_FOR_ME_TO_PROCEED);

}

如果不使用volatile,则优化器将认为该循环是无用的(该家伙从未设置过该值!他真是疯了,摆脱了该代码!),而我的代码将在没有获得信号量的情况下继续进行,从而导致以后出现问题。



查看完整回答
反对 回复 2019-12-03
?
慕容3067478

TA贡献1773条经验 获得超3个赞

volatile在开发嵌入式系统或设备驱动程序(需要读取或写入内存映射的硬件设备)时需要。特定设备寄存器的内容可以随时更改,因此您需要使用volatile关键字来确保编译器不会对此类访问进行优化。

查看完整回答
反对 回复 2019-12-03
?
繁星coding

TA贡献1797条经验 获得超4个赞

某些处理器的浮点寄存器的精度超过64位(例如,不带SSE的32位x86,请参见Peter的评论)。这样,如果您对双精度数字运行多个运算,则实际上得到的精度要比将每个中间结果截断为64位的精度更高。


通常这很好,但这意味着根据编译器如何分配寄存器和进行优化,对于完全相同的输入,完全相同的操作将产生不同的结果。如果需要一致性,则可以使用volatile关键字强制每个操作返回到内存。


对于某些没有代数意义但减少浮点误差的算法(例如Kahan求和),它也很有用。从代数角度讲,这是一个小问题,因此除非某些中间变量不稳定,否则它经常会被错误地优化。



查看完整回答
反对 回复 2019-12-03
  • 3 回答
  • 0 关注
  • 358 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信