Delphi类变量具有全局存储还是线程本地存储?

7

我猜类变量(“class var”)在存储上是真正的全局变量(即整个应用程序只有一个实例)。

但我想知道这是否属实,或者它们是线程存储(例如类似于“threadvar”)-每个线程一个实例。

有人知道吗?

编辑:更改“范围”为“存储”,因为这实际上是正确的术语,也是我要找的(感谢Barry)

3个回答

11

类变量根据其成员可见性属性进行作用域限定,具有全局存储而非线程存储。

作用域是一个语法概念,与从哪里可见标识符相关。这里关注的是变量的存储方式。


8

是的,类变量具有全局作用域。请查看RTL源代码以了解线程变量的实现细节。在Win32下,每个线程在创建时会自动分配一块内存块。这个额外的数据区域被用来包含您的线程变量。


我毫不怀疑你是正确的。不过,我在想这个系统应该如何工作......这是一个需要权威的“是/否”回答的问题,我想知道在“接受”答案之前应该考虑多少票才算“权威”。该怎么办呢? - Graza
Daniel的回答是正确的,我投了赞成票。不知道你是否可以通过将类变量引用到线程变量来使用一些诡计?我没有尝试过 - 也不会尝试 :) - Lars Fosdal
@Lars - 我猜引用标准类字段而不是“类变量”到线程变量应该就足够了。如果对象/变量的生命周期超出了引用对象实例的范围,并且需要一个线程变量,则已经提供了此生命周期,因此无需进一步的诡计。 - Graza
顺便说一句,我也在想同样的问题,但仅仅是出于兴趣。实际上,这个问题也只是出于兴趣(我不需要立即得到这个信息),并且是由其他人关于类变量提出的另一个问题引发的。 - Graza
我已经接受了这个答案,似乎我们都同意/知道它是正确的。然而,为了将来可能会遇到此问题的任何人着想,获取外部参考资料是很好的。 - Graza

1

类变量就像类一样:对于应用程序来说是全局和唯一的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接