【问题标题】:Is there a practical use for a `volatile restrict` pointer?`volatile restrict`指针有实际用途吗?
【发布时间】:2012-02-17 20:12:27
【问题描述】:

我可以看到 const volatile 限定变量的实际用途,例如

const volatile uint64_t seconds_since_1970;

如果底层硬件机制每秒更新一次值,但变量在(可能是嵌入式的)硬件中不可写。 并且由于所有三个(C11 中为四个)类型限定符都被认为是独立的,所有组合似乎都是允许的。但我无法想象在现实生活中restrict volatile 合格的指针真的有意义:

uint32_t * restrict volatile pointer_to_some_uint32;

[编辑:澄清一下:volatilerestrict 都适用于指针,而不适用于指向的对象!]

这是语言允许但本身无用的构造,还是我错过了一些有价值的应用领域?

【问题讨论】:

  • 四个? const volatile restrict ......你能告诉我第四个预选赛是什么吗?对不起我的小知识>o
  • @ikh C11 定义了一个限定符_Atomic

标签: c c99 language-lawyer restrict-qualifier


【解决方案1】:

没有限制,非易失性指针可以别名为易失性指针。因此,在每次通过 volatile 指针修改对象后,必须丢弃所有可能被指针引用的相同类型对象的寄存器缓存值。

使用restrict,你可以告诉编译器volatile指针不会别名,因此volatile的开销只适用于指向的对象,而不适用于所有其他可能通过指针访问的相同类型的对象。

【讨论】:

  • 在我的示例中,volatile 适用于指针,而不适用于它指向的对象。我知道使用volatile uint32_t * restrict pointer; 可能确实非常有用,但是同时声明指针本身volatilerestrict 不会将volatile 移动到指向的对象,是吗?
  • @Johan:考虑到底层硬件机制可能会不时更新pointer_to_some_uint32(这是牵强的,但实现可以做到),而且它写入的地址是保证不会被任何其他指针所别名。然后是volatile restrict。不过通常情况下,restrict 适用于函数参数,而volatile 对于局部变量毫无意义,因此您选择了一个不太可能使用的示例,即使它并非严格无用。
  • @SteveJessop 是的,这也是我的解释。我唯一想到的是某种垃圾收集器重新排列内存并在不同的线程/进程上下文中运行。如果没有其他指针指向由 GC 维护的内存块的 GC-admin 部分,则此类指针可以有效地同时是 volatile(因为 GC 可能会更改指针)和 restrict。但是@R.. 的答案似乎表明指向“继承”volatile 的对象(“volatile 的开销仅适用于指向的对象”),恕我直言,这是不正确的。
  • @Johan:我怀疑他只是误读了问题中的第二个例子——我第一次尝试时就这样做了,直到我看到你上面的第一条评论,我才意识到你是什么问。
  • 是的,我看错了。在这种情况下,volatilerestrict 确实没有交互作用,但它们各自的用处与它们总是有用的方式相同......
猜你喜欢
  • 2018-08-07
  • 1970-01-01
  • 1970-01-01
  • 2013-05-14
  • 1970-01-01
  • 2012-12-31
  • 1970-01-01
  • 2014-06-19
  • 1970-01-01
相关资源
最近更新 更多