10

初期化したいローカル レコードがあるとします。

type 
  TMyRec=record
    Val1, Val2:Integer;
  end;

procedure MyProc;
var
  MyVar:TMyRec;
begin
  // ... ?

  WriteLn(Val1,Val2);
end;

各フィールドを「手動で」設定する以外に、いくつかの方法があります。

  1. 初期化()を使用します。

    Initialize(MyVar);
    
  2. デフォルト()を使用:

    MyVar := Default(TMyVar);
    
  3. FillCharを使用します。

    FillChar(MyVar,SizeOf(MyVar),0);
    
  4. 空の定数を定義し、それを var に割り当てます

    const cMyVar:TMyVar=();  
    ...    
    MyVar := cMyVar;    
    

上記はすべて、この例のような状況で機能するようです。グローバル変数を定義して初期化することもできると思います。

しかし、好ましい方法はありますか?または、上記のいずれかを使用することが推奨されない、または単に機能しない特定の状況がありますか?

簡単に言うと、ローカル スタック変数を初期化するための決定的な正しい方法は何ですか? :-)

4

1 に答える 1

14

Initializeローカル変数には使用しないでください。

Initialize は、変数が新しい標準手順以外の方法で動的に割り当てられる Delphi コードでのみ使用してください。

さらに、マネージド型が含まれていないため、レコードで nop に最適化されます。したがって、このオプションを破棄して、フィールドを 3 つの候補に減らすことができます。

残りの 3 つの候補はすべて、初期化されていないローカル変数に対して同じ効果があります。FillCharただし、管理メンバー (文字列、インターフェイス参照、バリアントなど) を含むローカル変数で使用するのは危険です。管理メンバーが初期化されていると、参照カウント メカニズムが壊れます。ただし、レコードが初期化されていないことが確実な場合はFillChar、私の見解では見苦しくなりますが、安全で効率的です。FillChar個人的には、私はこの役割を拒否します。

それは去りDefault(T)、一定の割り当てです。古いバージョンの Delphi では、定数割り当てのみを使用できます。FillChar定数を宣言した時点で、定数の代入は と同じくらい醜いと言っても過言ではありません。Default()そのため、最新の Delphi バージョンでは、より簡潔で読みやすいという理由で、私は選択します。

同様の根拠をカバーする質問で説明したようDefault(T)に、変数に割り当てると、コンパイラは非常に効率的なコードを生成します。

于 2013-01-05T21:11:21.877 に答える