Calcium-X Asked:2024-04-28 00:43:01 +0000 UTC2024-04-28 00:43:01 +0000 UTC 2024-04-28 00:43:01 +0000 UTC C 中的 volatile 关键字 772 我不明白它的含义,无论我怎么google,到处都是肥皂写的或者没有实际代码的理论,谁能解释一下什么是 volatile 以及如何有意义地使用它? c 1 个回答 Voted Best Answer HolyBlackCat 2024-04-28T00:57:16Z2024-04-28T00:57:16Z volatile强制编译器不要优化对变量的写入/读取(不要用寄存器替换它,但始终写入 RAM,在被告知时准确读取和写入,...)。 如果您正在对某些硬件进行编程,其中写入内存中的特殊地址会导致一些特殊效果(某种内存映射IO),那么volatile您需要编译器不要对此内存写入执行任何奇怪的操作(不要通过优化来删除它,或者是其他东西)。 或者这是另一个例子:sig_atomic_t。这里手册说在处理程序内部std::signal可以使用volatile变量与外界通信。 它们还可以用于基准测试,以便编译器不会丢弃您测量的计算(将结果写入volatile变量)。 另外:在 C++26 之前,如果无限循环的循环体与外界没有联系,则无限循环被认为是 UB,因此它们不是将一个空循环体粘在一个变量上,而是将其固定i++在volatile一个变量上。在 C++26 中,允许使用空循环体的无限循环(非空循环仍然是非法的)。在C中,据我了解,它们以任何形式都是合法的。 即使在asm汇编语言插入中它也有一些特殊的含义;阅读手册。 不应该使用什么: 多线程——不知情的人尝试使用它们进行线程之间的通信。正确 - 使用std::atomic(在 C++ 中)和_Atomic(在 C 中)。 用拐杖支持 UB - 代码会突然崩溃,但只有在启用优化的情况下才会发生(通常是由于歪手和 UB)。有时volatile它可以修复此类崩溃,但最好修复 UB。
volatile强制编译器不要优化对变量的写入/读取(不要用寄存器替换它,但始终写入 RAM,在被告知时准确读取和写入,...)。如果您正在对某些硬件进行编程,其中写入内存中的特殊地址会导致一些特殊效果(某种内存映射IO),那么
volatile您需要编译器不要对此内存写入执行任何奇怪的操作(不要通过优化来删除它,或者是其他东西)。或者这是另一个例子:
sig_atomic_t。这里手册说在处理程序内部std::signal可以使用volatile变量与外界通信。它们还可以用于基准测试,以便编译器不会丢弃您测量的计算(将结果写入
volatile变量)。另外:在 C++26 之前,如果无限循环的循环体与外界没有联系,则无限循环被认为是 UB,因此它们不是将一个空循环体粘在一个变量上,而是将其固定
i++在volatile一个变量上。在 C++26 中,允许使用空循环体的无限循环(非空循环仍然是非法的)。在C中,据我了解,它们以任何形式都是合法的。即使在
asm汇编语言插入中它也有一些特殊的含义;阅读手册。不应该使用什么:
std::atomic(在 C++ 中)和_Atomic(在 C 中)。volatile它可以修复此类崩溃,但最好修复 UB。