2012-02-02 2 views
3

.cppファイル内の構造体のグローバル配列を初期化したいとします。私の配列サイズは約70000です。各構造体には2つのポインタ(サイズはそれぞれ4バイト)が含まれます。 .cpp初期化後のファイルサイズは1 MB以上になります。この大規模なグローバル配列とは別に、私はいくつかの小さな変数(10-20バイト)をいくつも持っています。静的に初期化された大きな配列(例:6555エントリ)のコンパイル時間が巨大です

このファイルをVisual Studio 2005でコンパイルすると、コンパイルに約10分かかります。 しかし、私がこの70000エントリの配列を35000エントリの2つの配列に分解すると、コンパイル時間はそれぞれ5分(元のビルド時間の半分)になります。しかし、私はプロジェクトの制約のために、私は複数の小さな配列でグローバル配列を分割したくない。しかし、コンパイル時間も短縮したい。いくつかのコンパイル最適化のトリックやコーディングトリックがコンパイル時間を短縮することが可能であることをお知らせください。

Struct node 
    { 
    char* name; 
    int* ptr; 
    } 
    typedef Struct node NODE; 

    NODE invalidNode = {invalidNodeName,NULL}; 

    NODE nodelist_10_nodeArray[] = {{"PETER",NULL}, 
        invalidNode, 
        invalidNode, 
        invalidNode, 
        {"George",NULL} 
        {"SUNDAR",NULL} 
        invalidNode, 
        ..., 
        ..., 
        ..., 

         }, 

注:無効なエントリが多数あります。

答えて

1

空のエントリで配列を設定し、有効なものを記入することができます。

(おそらく移植性がない、嫌なハック)個々の配列がメモリ内で連続して発生し、とにかくそれらを分解すると考えることができます。

言うことです:

NODE nodelist_10_nodeArray[] = { half the data }; 
NODE nodelist_10_nodeArray1[] = { the other half of the data }; 

をあなたは、この/べき/仕事の上のチェック配列の境界を持っていない場合。しかし、私はあなたのソースコードに、各セクションの前、後、間に非常に非常に明白なコメントを入れ、これは嫌なハックです。

しかし、実装定義の振る舞いに依存しているので、他のほとんどのソリューションが望ましいです。

1

同じ値を返す無効なエントリがたくさんある場合は、何らかの辞書を使うことを考えなければなりません。

std::map<int, NODE>を使用し、実行時に入力することができます(有効なエントリのみ)。しかし、実行時にそれを埋めることは、パフォーマンス上の問題となる可能性があります(有効な無効なエントリの比率に応じて、より多くのメモリが必要になります)。特定のインデックスのルックアップも遅くなりますが、O(1)の代わりにO(log(n))となります。

もう1つの解決策:newを使用してヒープ上に配列を作成し、塗りつぶします。実行時にファイルから入力することができます。

1

最初の質問は、この配列を静的にする必要があるかどうかです。しかし、そうであれば、コンパイル時にスペースを割り当てるだけで、実行時にはファイルから配列を埋め込むことができますか?

無効なエントリが多い場合は、ランダムアクセスに依存しない場合は、何らかの種類のハッシュコンテナを考慮する必要があります。

関連する問題