2011-09-21 70 views
8

在Visual C++中,「volatile」的MSDN文檔指出寫入具有「釋放語義」,並且讀取具有「獲取語義」,此外還確保讀取始終從內存中讀取,並且寫入始終相應寫入。Visual C++揮發性

「volatile」的C規範包括第二部分(不要瘋狂優化),但不包括第一部分(內存圍欄)。

是否有任何方式在Visual C++獲得「C」易失性行爲,沒有內存圍欄?

我想強制一個變量總是在堆棧中,在一個固定的位置,但我不想在每個分配上都佔用內存欄的開銷。

是否有任何簡單的方法來做到這一點與Visual C++源?

+0

第一部分不是標準C++行爲,我認爲。不過,我不確定。 – Nawaz

+0

「我想迫使一個變量總是在堆棧中,在一個固定的位置」,而volatile將如何幫助它? FWIW,變量總是*在固定點。 @Nawaz:不,第一部分不是標準。 –

+1

@Fernades局部變量並不總是在一個固定的位置。取決於PC的位置,局部變量可以被消除,或者它們的地址在不同的地方。優化器可以做很多瘋狂的事情。我想壓制這些優化。要做到這一點的方法是使用「易失性」。但是,我不希望Visual C++引入的非標準內存圍欄編輯爲 –

回答

4

有沒有什麼辦法在Visual C++獲得「C」易失性行爲,沒有內存圍欄?

在x86上有在組件級別創建無記憶柵欄上讀取並自該平臺每個負載具有收購語義上寫入到volatile存儲位置,每家店都有釋放語義。因此,對於x86上的MSVC,volatile指令只是指示編譯器防止加載和存儲的重新排序,具體取決於您是從標記爲volatile的內存位置進行寫入還是讀取。

由於平臺的內存排序模型不能確保加載和存儲的獲取和釋放語義,因此您只會在IA64體系結構上產生內存柵欄的「懲罰」。

請記住,此行爲是MSVC特有的,並不是volatile的標準化語義。

更新:根據@ildjarn,你會在ARM上看到Windows 8的內存圍欄,因爲該平臺也有IA64這樣的弱順序內存一致性模型。

+0

罰款也適用於ARM。 – ildjarn

+0

MSVC可以在ARM上工作嗎? ......我不知道你可以在ARM上運行Windows程序...... – Jason

+0

ARM是Windows 8的主要平臺,所以MSVC11也支持ARM作爲主要架構。 – ildjarn