我想知道/ 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/