9

Delphi中有类似Java内存模型的东西吗?为了防止误解:我的意思不是“巨大/大/小”,而是与其他线程更改的可见性有关的事情。

4

1 回答 1

14

我会说 Delphi 内存模型与 C++ 内存模型相匹配。也就是说,编译器不知道多进程或多线程,也不为这些场景提供任何特殊支持。请参阅“什么是 C++ 并发内存模型?”

Delphi 32 位编译器确实执行了诸如不变代码运动之类的优化,并且确实发出了旨在避免双流水线停滞的指令序列。但是,Delphi 编译器不包含指令调度器或窥孔优化器,因此指令重新排序的机会微乎其微。Delphi 优化在指令发出之前发生在 AST / IR 上。

可以注册局部变量,但是任何对需要内存地址的变量的源代码引用(例如将局部变量传递给 var 参数,或获取局部 var 的地址)都会强制编译器将注册值提交给在使用地址之前的内存位置,或者可能会强制编译器完全放弃注册变量。

Delphi 32 位编译器在优化方面相当保守。优化带来的最大性能提升来自注册变量和中间结果,以及各种循环归纳技巧。

对全局符号或驻留在全局内存中的符号(例如对象字段)的操作未注册。没有“volatile”修饰符。

编译器代码生成模式依赖于 x86 架构规则,即在对齐地址处对全局内存进行寄存器大小的写入是原子的。大数据、字节数据或未对齐地址的写入可能会跨越高速缓存行,并且需要在单个写入指令中进行两次单独的写入操作。Delphi 编译器(大部分)没有注意到这一点。

无论如何,如果您正在编写从不同线程访问共享内存的 Delphi 代码,那么您始终有责任决定哪些线程同步措施适合您的情况并实施它们。

于 2012-10-16T22:06:35.317 回答