c - C 中 volatile 关键字的正确使用

标签 c volatile

我是 C 初学者,我遇到了以下代码:

#include "stdio.h"

unsigned int ReturnSquare(void);

int main(void) {

int k;
int *mPtr;

mPtr = (int*) 0x1234;

*mPtr = 10;

 k = (int) ReturnSquare();

 printf("%p --> %d\n",mPtr,k);

}

unsigned int ReturnSquare(void)
{
  unsigned  volatile int a = * (unsigned volatile int *) 0x1234;
  unsigned  volatile int b = * (unsigned volatile int *) 0x1234;
  return a * b;
}

您能帮我理解一下这段代码中 volatile 的用途吗?

程序似乎无法正常运行。非常欢迎任何建议和解释。预先感谢您。

最佳答案

当您两次读取同一寄存器时,编译器可以决定优化行为。

它可以将代码变成这样:

unsigned  int a = * (unsigned int *) 0x1234;
unsigned  int b = a;

当您添加 volatile 时,编译器不会在第二次读取时假设该值将相同,并且它将生成额外的指令以取消引用指针以再次注册。

现在对您来说可能太先进,但您可以使用编译器上的汇编输出选项来检查这一点, volatile 版本将有更多汇编指令。

关于c - C 中 volatile 关键字的正确使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52273459/

相关文章:

c - 是否存在整数在转换为 double 时失去精度的情况?

来自编程珍珠的 c 标准库排序函数

java - 为什么线程在不同的运行方法体中表现不同?

c - 链表计数器的几个错误

C 创建空栈时出错

C++ - volatile应用于方法时代表什么?

java - 这种并发模式有名称吗?

c - 声明的数组没有大小和 const volatile

c++ - 使用 "pointer to volatile"是否始终阻止编译器优化?

c++ - 如何在 Windows 上链接动态构建的 cmake 文件?