【问题标题】:temporary volatile using casts使用强制转换的临时 volatile
【发布时间】:2022-01-19 14:24:00
【问题描述】:

volatile 值传递给它们时,一些 C 库函数会通过编译器忽略警告;例如memcpy()。 现在我想知道是否可以使用一些 volatile 强制转换来强制立即评估。 考虑:

int b; /* ... */
(volatile int) b = 1;
b = (volatile int) 1;

现在第二行会立即分配给b,第三行是否也一样? 或者不能将像1 这样的常量设置为“更不稳定”(意味着它不会有任何影响)?

【问题讨论】:

  • (volatile int) b = 1 创建一个临时的右值。你不能分配给那个。也许*((volatile int*)&b) = 1; 会有所作为。你最好检查一下组件。
  • 立即作为什么,立即汇编指令或只是英语“立即”?
  • @TedLyngmo 是的,我不能分配给它,但表达式会产生一个被忽略的“易失性”值。但副作用应该是编译器不会移动指令,我猜。
  • @Lundin 想象一下,在该语句之前和之后还有许多其他指令(如/* ... */ 所建议的那样)。立即应该意味着编译器不会移动语句,这意味着它在执行之前的指令之后进行评估,并且之后的指令在该语句之后执行 - 很好。
  • 对于那些感兴趣的人,我在这里发布了一个关于该错误的问题:Non-conforming optimizations of volatile in gcc 11.1

标签: c casting volatile


【解决方案1】:

限定符(constrestrictvolatile_Atomic)从不应用于值。它们只适用于对象,因为它们告诉编译器如何处理对象的内存。

所以(volatile int) b(volatile int) 1(int) b(int) 1 没有区别。

您可以使用 volatile 左值访问非 volatile 对象,例如 * (volatile int *) &x = value;。然后 C 实现必须严格按照 C 抽象机的语义访问对象(读取或写入)。它通常可以使用其他非易失性表达式重新排序,但不能使用可观察的行为:访问易失性对象、交互式 I/O 和写入文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多