0

静的変数、またはそうするための他の方法について質問があります。

マスタークラスのPatternMatcherがあります。使用するマッチャーに応じて、そこから派生したユニットがいくつかあります。ここで、各サブクラスはfloatのベクトルを格納する必要がありますが、各クラス内では定数です。そのベクターのデータは初期化中に読み取られ、最大1GBのサイズにすることができます(私が持っている最小のものは1MB、最大のものは1GBです)。現在、たとえばMatcher_Aのインスタンスが2つある場合、2倍のメモリが割り当てられます。どのマッチャーを使用するかは事前にわかりません(1回の実行で3つのマッチャーになり、同じマッチャーを数回使用できます)。実行時に、必要なマッチャーがすでにどこかで初期化されているかどうかを確認したくないのです。これは、変更を加えるたびに追加のコードが必要になるためです。

現在、3つのマッチャーを割り当てています

PatternMatcher* a = new PMMatcherA();
PatternMatcher* b = new PMMatcherB();
PatternMatcher* c = new PMMatcherC();

、ただし、ユーザーが選択するため、たとえばAとCが同じである可能性があります。を介してチェックを実行するとtypeid(a).name();、どのクラスで開始したかに関係なく、結果としてPatternMatcherが得られます。PatternMatcherは、基本的に純粋に仮想クラスです。

静的とは、変数がさまざまな割り当てで一定であることを意味すると常に思っていましたが、ベクトルを静的として定義すると、リンカー解決エラーが発生します。以前の反復では、これらのベクトルをグローバルにしましたが、クラスにローカライズすることをお勧めします。

初期化時のベクトルを次の初期化ですでに使用できるようにするために使用する必要のあるキーワードは何ですか?ベクトルサイズが0より大きいかどうかを簡単にチェックするだけで十分ですが、すべてのオブジェクトは独自のベクトルを使用します。

4

3 に答える 3

1

はい、staticあなたが必要なものです。次のように使用できます。

class MyClass
{
private:
    static std::vector< float > data_;
};

std::vector< float > MyClass::data_;

クラス自体では静的変数のみを宣言することに注意してください。ただし、クラスの外部で1回だけ定義する必要もあります。そのため、この行があります。これを省略すると、リンカーエラーが発生します。std::vector< float > MyClass::data_;

この後、クラスのすべてのオブジェクトは同じベクトルMyClassを共有します。data_

クラスの任意のオブジェクトから操作できます。

MyClass a;
a.data_.push_back(0);

またはクラス名を介して:

MyClass::data_.push_back(0);

于 2012-08-06T09:38:38.480 に答える
1

staticキーワード行く方法です-それはクラス全体のメンバーのちょうど1つのコピーを保存します。欠落していたのは、リンカが使用できるように、コンパイルモジュールでそのような静的を実際に宣言することです。例えば:

header file foo.h

struct Foo {
  static int s_int;
}

source file foo.cpp

#include "foo.h"
int Foo::s_int; // optionally =0 for initialization

2番目の部分は、静的メンバーとして使用されるオブジェクトにメモリスペースを割り当てるため、非常に重要です。

ただし、次の点に注意してください。

  • staticメンバーはすべて、のに初期化さmain()れます。つまり、誰かがその特定のクラスを使用したかどうかに関係なく、1GBのデータが読み取られます。
  • 上記の問題を回避することはできますが、実行時にデータのロードと初期化が行われたかどうかを確認する必要があります

ただし、別のオプションがあります。フロートを「現状のまま」(つまり、バイナリ形式で各32ビット)保存する場合は、ファイルをメモリスペースに「マッピング」して、すでにロードされているかのようにアクセスできます。OSがロードを処理します。必要に応じて適切な4KページをRAMに挿入します。

詳細についてmmapは、http://en.wikipedia.org/wiki/Mmapをご覧ください。

于 2012-08-06T09:39:00.620 に答える
1

ベクトルを静的として定義すると、リンカー解決エラーが発生します。

これは、静的変数を(ヘッダーファイルで)宣言しているが、実装ファイル(.cpp)の1つで明示的に初期化しないためです。

例えば:

//AClass.h 
class AClass
{
    private:
    static std::vector<int> static_vector;

};

および.cpp実装ファイル内:

std::vector<int> AClass::static_vector;
于 2012-08-06T09:40:29.617 に答える