是否有一个`volatile restrict`指针的实际用途?

时间:2012-01-24 15:17:34

标签: c c99 language-lawyer restrict-qualifier

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

const volatile uint64_t seconds_since_1970;

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

uint32_t * restrict volatile pointer_to_some_uint32;

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

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

1 个答案:

答案 0 :(得分:8)

不受限制,非易失性指针可以为易失性指针设置别名。因此,在通过易失性指针对对象进行每次修改之后,必须丢弃所有相同类型的潜在指针引用对象的寄存器缓存值。

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