2011-10-18 26 views
1

volatile似乎是每個人永無止境的問題。我想我知道它的一切,但後來我遇到這樣的:釋放(vfree-ing)指向易失性數據的指針

所以,我有一塊線程之間共享內存和我定義它是這樣的:

volatile type *name; 

如果它讓你感覺更好,你可以想象type只是一個int

這意味着我有一個指針(即不易變)的一些數據是易變的。因此,例如,當涉及到優化時,編譯器可以緩存name的值,但不會緩存name[0]。我對嗎?

所以,現在我vfree荷蘭國際集團這個指針(這是一個Linux內核模塊),它告訴我,vfree預計const void *當我路過它volatile type *

我明白如何通過volatile type *作爲type *是危險的,因爲在該函數中,name[i]的值可能會被緩存(作爲優化的結果),這是不可取的。

我不明白爲什麼,vfree希望我發送一個指向非易失性數據的指針。有什麼我在那裏失蹤?還是隻是寫了vfree的人沒有想到這種情況?

我假設我簡單地將我的指針投射到void *不會造成任何傷害,是嗎?

回答

0

我的結論是,到volatile數據只是一些被忽略的只是投放指針void *不會造成問題,而事實上,freevfree不直接接受指針。

2

vfree函數(和一般的每個理智的釋放函數)並不關心您的實際數據(無論是否爲volatile)。它只是期望一個(有效)指針(想想:將指針作爲一個long值傳遞到CPU寄存器中)。

基於該值,該函數將:

  1. 通話平板/竹節釋放內存
  2. 取出內存映射

所以,是的,強制轉換爲void *不會在運行時造成任何傷害。

+0

嗯,但爲什麼'vfree'不接受'volatile type *'?你認爲編寫這些代碼的人是否忘記了這個問題,或者這對他們來說真的很重要? – Shahbaz

+0

我想我在這裏同意Mircea。 'free()'不應該在乎數據是否是不穩定的。如果你使用'volatile'是因爲它是任務之間的共享內存,那麼你最好在你釋放它之前確保沒有人使用它,然後你沒有什麼可擔心的。如果你使用volatile,因爲它是內存映射的I/O,那麼我不確定你爲什麼要釋放。 'vfree'函數不需要'volatile void *',因爲'vmalloc'中的「v」代表「虛擬」,而不是「volatile」。 –

+1

@Shahbaz:如果您分配的內存包含易失性數據,那麼這些開發人員無關緊要。 vfree()函數只需要一個指向該內存的指針。開發者沒有忘記任何東西。 – Mircea