2012-01-24 32 views
11

我可以看到实用上要const volatile限定的变量,就像“volatile restrict”指针有实际用途吗?

const volatile uint64_t seconds_since_1970; 

如果底层硬件机制更新该值每第二,但变量不是在(可能嵌入的)硬件可写的。 由于所有三个(C11中的四个)类型限定符被认为是独立的,所以所有组合似乎都被允许。但我不知所措想象现实生活中的情况,即restrict volatile合格的指针将真正意义:

uint32_t * restrict volatile pointer_to_some_uint32; 

[编辑:澄清:两款volatilerestrict适用于指针,而不是指向的对象以!]

这是一个允许的语言,但本身无用,或者我错过了一些应用领域,这可能是有价值的吗?

+0

四? 'const'' volatile''restrict' ......你能告诉我第四个限定词是什么吗?对不起,我的小知识> o < – ikh

+0

@ikh C11定义了一个限定符_Atomic。 –

回答

8

如果没有限制,非易失性指针可能会使用易失性指针。因此,在通过易失性指针对对象进行每次修改之后,必须丢弃相同类型的所有潜在指针引用对象的寄存器缓存值。

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

+0

在我的例子中,'volatile'适用于指针,而不是它指向的对象。我知道使用'volatile uint32_t * restrict指针'可能确实非常有用,但是声明指针本身都是volatile和restrict都不会将volatile指向给指向的对象。 –

+1

@Johan:考虑一下底层硬件机制可能会不时更新'pointer_to_some_uint32'(这很牵强,但一个实现可以做到),而且它写入的地址保证不会被任何别名其他指针。然后它是'挥发性限制'。通常情况下,'restrict'对于函数参数很有帮助,volatile对于局部变量来说是没有意义的,所以你选择了一个不太可能被使用的例子,即使它不是毫无用处。 –

+0

@SteveJessop是的,这也是我的解释。我唯一想到的是某种垃圾收集器重新安排内存并在不同的线程/进程环境中运行。如果没有其他指针指向由GC维护的内存块的GC管理部分,那么这些指针可以有效地同时为'volatile'(因为GC可能会更改指针)和'restrict'。但@R的答案似乎表明指向“继承”volatile对象(“volatile的开销仅适用于指向的对象”),这是不正确的恕我直言。 –