2008-10-24 134 views
10

在C和C++的變量可以被標記爲volatile,這意味着,編譯器不會優化它,因爲它可被修改外部聲明對象。在Delphi編程中有沒有相同的東西?如果不是關鍵字,也許是解決方法?Delphi有沒有和C的volatile變量等價的東西?

我的想法是使用絕對,但我不確定,這可能會引入其他副作用。

+0

Absolute爲同一位置引入別名,不同的名稱(可能爲類型)。 – 2008-10-24 01:29:12

回答

13

簡短的回答:沒有。

不過,我不知道其中的編譯器保守的方法將改變數的讀取或如果按照這種方法寫的任何情況:

當讀取一個跨線程顯眼的位置,保存其在進行任何進一步操作之前對本地價值;同樣,限制寫入單個分配。

的Delphi編譯器上,當有來表達與非內聯函數調用的非本地位置表達不執行公共子表達式消除(CSE),因爲編譯器不間優化,因此它不會是即使對於單線程代碼也是如此。

所以,你可能需要使用InterlockedExchange()做你的讀取和寫入,迫使這一點;此外,這將導致完整的內存屏障,因此處理器不會對讀取和寫入進行重新排序。

1

我不知道任何等價物,也不認爲絕對指令將幫助你。 絕對允許您有兩個使用相同地址的變量,但我不認爲這會阻止編譯器優化對該內存的引用。

我想你可以用一個指針和管理它自己。這樣,無論編譯器如何優化指針值的回溯,它都不應該假設存儲在地址處的值與上次讀取它時的值相同,但這是純粹的推測。

0

使用動態分配的指針?

var 
    MyVarPtr: ^integer; 
begin 
    New(MyVarPtr); 
    MyVarPtr^ := 5; 
... 

這應該使編譯器不使用整數值的寄存器(但它可能仍然使用一個地址)。不過,我不確定這是如何與易變的相比。

6

The Delphi Language for Mobile Development白皮書,德爾福的移動編譯器都支持一個[volatile]屬性,因爲他們首次推出:

volatile屬性用來標記都受到不同線程轉換行業,使代碼生成不會優化複製寄存器或其他臨時存儲器位置中的值。

可以使用volatile屬性來標記以下聲明:

  • 變量(全局和局部)
  • 參數
  • 紀錄或一類的領域。

不能使用揮發屬性來標記以下聲明:

  • 類型
  • 過程,函數或方法
  • 表達式

type 
    TMyClass = class 
    private 
    [volatile] FMyVariable: TMyType; 
    end; 

從Delphi 10.1柏林開始,桌面編譯器現在也支持[volatile]

Attributes Supported by All Compilers

現在,所有的Delphi編譯器支持以下屬性:

相關問題