Delphi有没有和C的volatile变量等价的东西?

问题描述:

在C和C++的变量可以被标记为volatile,这意味着,编译器不会优化它,因为它可被修改外部声明对象。在Delphi编程中有没有相同的东西?如果不是关键字,也许是解决方法?Delphi有没有和C的volatile变量等价的东西?

我的想法是使用绝对,但我不确定,这可能会引入其他副作用。

+0

Absolute为同一位置引入别名,不同的名称(可能为类型)。 – 2008-10-24 01:29:12

简短的回答:没有。

不过,我不知道其中的编译器保守的方法将改变数的读取或如果按照这种方法写的任何情况:

当读取一个跨线程显眼的位置,保存其在进行任何进一步操作之前对本地价值;同样,限制写入单个分配。

的Delphi编译器上,当有来表达与非内联函数调用的非本地位置表达不执行公共子表达式消除(CSE),因为编译器不间优化,因此它不会是即使对于单线程代码也是如此。

所以,你可能需要使用InterlockedExchange()做你的读取和写入,迫使这一点;此外,这将导致完整的内存屏障,因此处理器不会对读取和写入进行重新排序。

我不知道任何等价物,也不认为绝对指令将帮助你。 绝对允许您有两个使用相同地址的变量,但我不认为这会阻止编译器优化对该内存的引用。

我想你可以用一个指针和管理它自己。这样,无论编译器如何优化指针值的回溯,它都不应该假设存储在地址处的值与上次读取它时的值相同,但这是纯粹的推测。

使用动态分配的指针?

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

这应该使编译器不使用整数值的寄存器(但它可能仍然使用一个地址)。不过,我不确定这是如何与易变的相比。

德尔福对于.NET不具备任何关键字,但.NET平台具有UTIL它的功能。见Thread.VolatileReadThread.VolatileWrite

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编译器支持以下属性: