寄存器使用 volatile

Use of volatile for registers

我想知道 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; 再次读取。只需使用之前读取并保存在某个内部 memory/register 中的值。目标 var1/var2,即 volatile,不影响分配的 right-hand-side。

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

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

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

如您所写,volatile char var1 = * (volatile char *) 0x2000000;,这表示创建一个名为 var1 的对象(分配在 C 实现选择的位置)并将其初始化为从 0x2000000 读取的值。每次读取 var1 时,将从实现分配的位置读取复制的值。不会从0x2000000重新读取。

您可能想要 volatile char *var1 = (volatile char *) 0x2000000;。这将 var1 定义为指向 0x2000000 的指针。使用此定义,每次使用 *var1 时,将从 0x2000000.

读取值