2012-01-24 33 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的開銷僅適用於指向的對象」),這是不正確的恕我直言。 –