delphi - 可写本地常量

标签 delphi

别开枪打我,但这是我第一次看到本地可写 const的用法(或者也许我太老了...... ):"The WinAPI way (by Peter Below from TeamB)"

看看本地 const FullScreen: Boolean = False; 然后 FullScreen := not FullScreen;

起初我以为这是现代 Delphi 版本的一个新功能,但它也适用于我的 D5。所以我的问题是:本地可写常量与声明全局可写常量完全相同吗?

例如

procedure TForm1.Button1Click(Sender: TObject);
Const
  LocalConst: Boolean = False;
begin
  LocalConst := not LocalConst;
  if LocalConst then Beep;
end;

与此代码的工作原理相同吗? :

Const
  GlobalConst_Button2Click: Boolean = False;

procedure TForm1.Button2Click(Sender: TObject);
begin
  GlobalConst_Button2Click := not GlobalConst_Button2Click;
  if GlobalConst_Button2Click then Beep;
end;

或者,LocalConst 对于它的方法来说是本地的,即静态的?这个常量线程安全吗?
谁能解释一下这个问题?

最佳答案

具有本地和全局类型常量的代码执行完全相同的操作。

正如 David 已经指出的那样,全局静态变量(又名类型化常量)在整个程序中是可访问的,而局部静态变量则不然。 下面我将类型化常量称为静态变量,因为这就是它们的真正含义。

但是,局部静态变量确实以与全局静态变量完全相同的方式保留在内存中。只是编译器不允许您从例程外部访问本地变量。
另请注意,如果您的本地静态变量特别大(或者您有很多静态变量),它们将消耗大量内存(即使我无法想象这可能会成为问题的场景).

由于静态变量驻留在固定位置,因此它不是线程安全的。 它有效地变成了所有线程实例之间的共享变量。
如果静态变量无法在单个 CPU 周期内更改(即,如果它大于整数或如果它是复杂类型),那么两个线程可以同时更改变量的不同部分,通常会导致损坏。

它可以在一个周期内改变,例如一个 bool 值或整数,您永远无法知道您所在的线程是最后更改它的线程还是另一个线程,这在大多数情况下会导致不可预测的结果。

简而言之
在线程代码中使用静态变量是一个非常糟糕的主意,除非您确切地知道自己在做什么。

整数计数器可能是一个异常(exception),您只需递增并测试是否发生了超过 x 次执行。
静态变量通常不适合在线程之间传递消息。

如果您想在线程之间共享数据,最好使用threadvar
请参阅:http://en.wikipedia.org/wiki/Thread-local_storage
和:https://stackoverflow.com/search?q=delphi+threadvar

终于
很少有问题需要全局静态变量,最好避免它们,因为它们很危险。
本地静态变量在单线程代码中非常有用,可以跟踪例程的不同执行之间的状态。
由于竞争条件,它们对于在多线程代码中执行此操作毫无用处。

关于delphi - 可写本地常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9654700/

相关文章:

delphi - 警告 : Unsafe typecast of 'TSmallPoint' to 'Integer'

delphi - 绝对数据库文件到sqlite转换器

delphi - 在非 GUI 环境 (DLL) 中使用事件监听器 (Delphi)

delphi - 我无法在打开和保存对话框中获得 Delphi 上下文相关帮助

delphi - 任务栏宽度、高度和位置

delphi - "One class per file"规则是否存在一些 Delphi 特定问题?

delphi - 在 DLL 中使用 IXMLDocument 需要 CoInitialize?

Delphi Intraweb 捆绑 SSL

delphi - 无法检查类是否已创建

multithreading - ThreadPool,QueueUserWorkItem和关机时死锁