c - 寄存器中使用 volatile

标签 c volatile

我想知道/ volatile 声明的工作效率如何。在下面的代码中:

volatile char var1 = * (volatile char *) 0x2000000;
printf("%d \n", var1 + 1);

这意味着每次我使用变量“var”时,它都会从地址内存0x2000000加载,但是固定地址的 volatile 转换是必要的,还是只是为了适合var1的类型?

这是否意味着每次读取“var1”时,都是从内存中读取,而不是从潜在的缓存值中读取?那么在这段代码中,我们访问了两次地址0x2000000?

最佳答案

but is the volatile cast of a fixed address necessary, (?)

是的,请考虑以下因素。编译器可能会认为 (char *) 0x2000000 被读取一次,不需要再次读取 volatile char var2 = * (char *) 0x2000000;。只需使用之前读取并保存在某些内部存储器/寄存器中的值即可。目标 var1/var2 volatile ,不会影响赋值的右侧。

volatile char var1 = * (char *) 0x2000000;
printf("%d \n", var1);
volatile char var2 = * (char *) 0x2000000;
printf("%d \n", var2);

不需要带有 volatile char var1 volatile 。定义指向 volatile 数据的指针可能更符合编码目标。

volatile char *ptr1 = (volatile char *) 0x2000000;
printf("%d \n", *ptr1);
printf("%d \n", *ptr1);  // A 2nd read of `(volatile char *) 0x2000000` occurs.

关于c - 寄存器中使用 volatile,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49039977/

相关文章:

C程序不会计算min和max(大和小)

C - 在整数变量中查找初始化数据的大小

c++ - MPI_Scatter 一个二维数组在其他二维数组中

java - volatile 变量的更新值对其他线程不可见

java - 在 DCL 的情况下需要 volatile 关键字

c - 如何获取函数内 double 值的绝对值(不使用 math.h)

c - 64 位十六进制的可移植 printf 格式说明符?

java - 正确理解 volatile、syncronized 和 AtomicReference 等概念?

c++ - 为什么对 volatile int 的 const 引用需要 static_cast?

c# - 内存型号 : preventing store-release and load-acquire reordering