2012-01-14 6 views
6

私は/副作用/利点誰かが作った最新のコード変更の意味を理解しようとしています。このコードを変更する目的はどのような目的ですか?

オリジナル

static List<type1> Data; 

static List<type1> & getData (void) 
{ 
    static List<type1> * iList = new List<type1>; 
    return * iList; 
} 
#define Data getData() 

変更がどのような目的を果たすことができを修正:次のように変更はありますか?

+0

を静的変数の初期化を遅らせるためには、問題? – Anycorn

+2

'#define Data ...'は問題を尋ねているだけです – tenfour

+0

@ Lol4t0:あなたのコメントについてもう少し詳しく説明できますか?どのようにスレッドセーフではないのですか? – Lazer

答えて

4

私が見ることができるリビジョンの利点は、「初期化時間」の問題です。

main()が呼び出される前に古いコードが初期化をトリガしました。

getData()が初めて呼び出されるまで、新しいコードは初期化をトリガーしません。関数が呼び出されない場合は、使用しなかった変数を初期化するために決して支払うことはありません。 (マイナーな)欠点は、関数が使用されるたびに生成されたコードに初期化チェックがあり、データのリストにアクセスする必要があるたびに関数呼び出しがあることです。

+0

一度初期化されると、値の有効期間はどうなりますか?それは同じだろうか? – Lazer

+0

初期化されると、永遠に(プログラムが終了するまで)永遠に続きます。それはきちんと破壊されなければならない、と私は信じている。 (ああ、それは動的に割り当てられています;プログラムが終了したときに 'リーク'しただけかもしれません)このような 'リーク'は、リストにあるデータ型がプログラムの終了時に正式に解放される必要があるリソースを取得しない限り、 ) –

+0

@Lazer:はい。元のコードの場合と同じです。 –

3

静的持続時間を持つ変数を持つ場合は、アプリケーションの初期化時に作成されます。アプリケーションが終了すると、オブジェクトは破棄されます。異なるオブジェクトが作成される順序を制御することはできません。

この変更により、最初に使用されたときにオブジェクトが作成され、(動的に割り当てられたときに)オブジェクトは破棄されません。

これは、他のオブジェクトが破棄されたときにこのオブジェクトが必要な場合には、これは良いことです。

更新

元のコードは、変数Dataを使用してオブジェクトにアクセス。新しいコードを変更する必要はありません。コードでDataを使用すると、実際にマクロDataが使用されますが、これはgetData()に展開されます。この関数は、実際の(動的に割り当てられたオブジェクト)への参照を返します。実際には、新しいコードは、古いコードのドロップイン置換として機能しますが、唯一の顕著な違いは、上記の元の答えで説明したものです。

+0

はいオブジェクトは破棄されませんが、どのようにアクセスされますか? – Lazer

+0

誰かが 'getData'、Lazerを呼び出すたびにアクセスされます。 –

1

最初の使用がDataになるまでの遅延構成は、 "static initialization order fiasco"を回避します。あなたのListに関するいくつかの推測を作る

は、...デフォルト-構築Dataは、おそらくtype1項目の空のリストであるので、それは問題で大失敗を招く大きなリスクではおそらくありません。しかし、たぶん、誰かが残念ではなく安全だと感じたのかもしれません。

関連する問題