0

プログラムの実行ごとに構築に約 30 秒かかるオブジェクトがあるとします。このオブジェクトは、プログラムが実行されるたびに同じデータで構成されます。この問題にはどのような解決策がありますか?

編集:

私の質問のより具体的なバージョンに合わせた調査を行いました。特に、ハッシュ テーブルにいくつかの値を設定したいと考えていました。この正確な問題に対処するhttp://www.gnu.org/software/gperf/を見つけました。gperf は、完全なハッシュ関数と関連するテーブルを生成します。

4

3 に答える 3

2

C++11 では、「定数式」の拡張された概念が導入されています。これは、次のconstexprキーワードを使用してオブジェクトに与えることができます。

constexpr int a = 12;      // constant expression

constexpr int f(int n) { return a * n; }

constexpr int b = f(a);    // also constant expression

オブジェクトにはコンストラクターも宣言されている場合がありconstexprます。関数を定数式として修飾するためのルールは非常に制限的ですが、そのようなオブジェクトを作成できる場合、定数式であるグローバル オブジェクトは実際にコンパイル時に計算および格納される可能性があります。それらは「静的に初期化」されていると見なされます(基本的に、プログラムの起動前に初期化されます)。

C++11 より前は、最も単純なプリミティブ型のみがこのような処理に適格でした。

std::map動的割り当てを必要とするものは、決して定数式にはならないため、静的に初期化されたグローバルのようなものを持つことは期待できません。

于 2012-09-21T14:46:19.277 に答える
1

あなたの問題に対する一般的な解決策はありません。オブジェクトを分析して、その 30 秒間に何が作成されているかを判断し、集中的な計算を必要とせずに特定のデータを表す方法を見つける必要があります。

計算を行わずに特定のデータを再現する方法を理解したら、任意のストレージ (後でコンパイル済みオブジェクトに追加するための一時ストレージを含む) に簡単にシリアル化できます。そこから、デシリアライズしてオブジェクトに戻すことは、難しい作業ではありません。

もちろん、これは、オブジェクトによって使用される動的リソース (開いているファイル、ソケット、メモリ割り当てなど) がないことを前提としています。それをシリアル化することはできません。

于 2012-09-21T14:45:58.757 に答える
1

オブジェクトを別の方法で表現する方法を検討してください。たとえば、生成するのが多層画像の場合、実行するたびに画像を生成するのではなく、完全に合成された画像をロードするだけです。

于 2012-09-21T14:46:41.460 に答える