2008-09-17 8 views
6

私の推測では、クラス変数( "class var")は本当にストレージ内でグローバルである(つまり、アプリケーション全体の1つのインスタンス)。Delphiのクラス変数には、グローバルまたはスレッドローカルストレージがありますか?

しかし、私はこれが当てはまるかどうか、またはそれらがストレージ内のスレッド(例えば、 "threadvar"に似ています)であるかどうか疑問に思っています。

誰でも知っていますか?

編集:これは実際には正しい用語であるとして「ストレージ」に「範囲」に変更し、私は(感謝バリー)の後だ

答えて

7

はい、クラス変数は、グローバルスコープされています。 threadvarsの実装方法の詳細については、RTLソースを参照してください。 Win32では、各スレッドは、スレッド作成時に自動的に割り当てられたメモリブロックを持つことができます。この余分なデータ領域は、スレッドバーを格納するために使用される領域です。

+0

私は間違いないあなたが正しいです。システムはどのように動作するのだろうか...これは権威ある「はい/いいえ」の回答を必要とする質問です。回答を「受け入れる」前に「権威ある」と考えるべき投票がいくつあるのでしょうか?何をするか、何をするか..... – Graza

+0

ダニエルの答えが正しいと私はそれを投票した。私はスレッドvarにクラスvarを参照することによって少しトリッキーを使用することができますか?しようとしていない - と試してみるつもりはありません:) –

+0

@ラス - 私はthreadvarの "クラスvar"ではなく、*標準*クラスのフィールドを参照すると十分だろうと思います。オブジェクト/変数の寿命が参照オブジェクトのインスタンス外にあり、スレッド変数が必要な場合は、このライフタイムがすでに提供されているため、さらに細かいことは必要ありません。 – Graza

9

クラス変数は、メンバーの可視性属性に応じてスコープが設定され、スレッド記憶域ではなくグローバル記憶域を持ちます。

スコープは構文概念であり、どの識別子がどこから見えるかに関係します。これはここで問題となる変数の格納場所です。

+0

良い点 - 私は私のセマンティクスがかなり正しくはないと感じました... – Graza

1

クラス変数はクラスと似ています。アプリケーションのグローバル変数とユニーク変数です。

関連する問題