C语言 Volatile变量

ovfsdjhp  于 2023-10-16  发布在  其他
关注(0)|答案(7)|浏览(114)

volatile变量存储在程序存储器的什么位置(在哪个部分)?

ocebsuys

ocebsuys1#

volatiletype qualifier而不是storage class specifier,所以它根本不确定存储位置;它影响变量类型的定义,而不是它的存储。
它只是强制编译器从变量的存储位置(无论它在哪里)显式地读取 typevolatile的变量,而不是假设以前在寄存器中读取的值仍然有效。

xriantvc

xriantvc2#

在C语言中,volatile只是告诉编译器-“你没有足够的知识来假设这个变量的值没有改变”。没有“节”,如BSS,CSS的。
将其视为编译器的一个标志,以防止某些类型的优化。它在嵌入式编程中非常方便,其中某个地址的内存可能会由于硬件设备输入而“改变”。
这里有一个很好的解释:http://www.embedded.com/columns/programmingpointers/174300478?_requestid=137658

knpiaxh1

knpiaxh13#

变量的易失性不会改变变量存储的位置。它改变的是关于如何访问它的读和写的语义。
我不相信C标准对volatile的实现有任何说明。但通常,volatile保证变量的写操作的释放语义和变量的读操作的获取语义。但这并不适用于每个实现,您应该仔细阅读特定编译器保证的内容

u59ebvdq

u59ebvdq4#

volatile与存储类无关。
volatile只是告诉编译器或强制编译器“不对该变量进行优化”。因此编译器不会为该变量优化代码,也不会从指定位置阅读值,而不是通过保存前一个值的内部寄存器。
因此,通过将变量声明为volatile..它保证你将得到最新的值,这可能会被外部事件改变。
你的代码可能工作得很好,如果没有声明变量为volatile,但有时可能没有得到正确的值。因此,为了避免这种情况,我们应该将变量声明为volatile。
volatile通常用于处理外部事件,如硬件相关引脚的中断。
示例。阅读指针值。
const voltile意味着你不能在代码中修改或改变该变量的值。只有外部事件才能改变值。
控制器引脚通常被定义为易失性的。可能是通过声明变量作为易失性控制器将做“读引脚”不是“读锁存器”.这是我的建议。也许是错的
但是在选择变量作为volatile时仍然有很多困惑。
当一个变量的值可能发生意外变化时,它应该被声明为volatile。实际上,只有三种类型的变量可以改变:
1.存储器Map外围寄存器
1.由中断服务程序修改的全局变量
1.多线程应用程序中的全局变量
友情链接:http://eetimes.com/discussion/beginner-s-corner/4023801/Introduction-to-the-Volatile-Keyword
所以在这种情况下,它被认为是易变的。

wa7juj8i

wa7juj8i5#

没有理由将volatile变量存储在内存的任何“特殊”部分。它通常与任何其他变量一起存储,包括非易失性变量。如果某个编译器决定将volatile变量存储在内存的某个特殊区域-没有什么可以阻止它这样做。但在语言层面上,这绝对没有理由。
你为什么问这样的问题?是什么让你认为它应该存储在内存的某个特殊区域?

pu82cl6c

pu82cl6c6#

“Volatile”在C/C++规范中使用,以允许使用内存Map设备。它指示编译器不要优化用此关键字定义的变量,因为该变量在编译器可见的代码中似乎不会更改其状态。

sshcrbum

sshcrbum7#

当使用longjmp()时,所有在setjump()之前定义的auto和register变量,以及在setjmp()longjmp()之间更改的变量将恢复到它们在setjmp()发生之前的值,即“回滚”,以防止您将auto变量声明为volatile

BN这只会发生在你告诉编译器做优化的时候

相关问题