2

私は現在、大規模な数値計算を行っています。変数(double型)を使用する場合は、速度が最も重要です。次のことを行うためのより読みやすい方法があるかどうか、または構造体またはブーストライブラリを使用するより良い方法があるかどうかを知りたい。

更新:いくつかの後で、多くの変数による私の最初の目的は、変数を参照/ポインターではなくオブジェクトとして維持しながら、変数をある種のコンテナーに間接的に編成することです。

1)変数に対して大規模で時間のかかる計算を行います。変数は、使用されている順序で宣言され、プログラム全体で変更されます。

2)コードを編集することにしたときはいつでも変数をプログラムに追加できます(かなり頻繁に)

3)変数を(ポインターのコンテナーなどに)整理することは、これらのオブジェクトをまとめて操作しやすくするために重要です。たとえば、しばらくしてこれらすべてのオブジェクトをファイルに書き込むと、コードがはるかに合理化され、効率的になります。

代わりに、型を作成し(すべての変数オブジェクトはdouble型です)、ポインターのベクトルに自動的に追加するクラスを作成することを考えていました-副次的な質問として、これはやり過ぎでしょうか

私はそのようなあらゆる種類の計算を行う多くの変数を持っています(これには時間がかかります):

double varName1 = someValue;
double varName2 = someValue;
double varName3 = someValue;
...
double varNameN = someValue;
...
SOME_COMPUTATION HERE

これは、各変数を読みやすくするための最も明白な方法だと思います。将来可能な出力のためにコレクションを保存するために、すべてをコンテナーに入れ、次のように各要素への参照変数を作成しました。

std::vector<double> store;
...
ADD VALUES TO VECTOR
...
double& varName1 = store[0];
double& varName2 = store[1];
...

ただし、上記の方法を実行すると、参照(&)変数を使用した計算はよりコストがかかります(時間外)。次に、反対のことを行うことにしました。たとえば、すべてのファイルをファイルに書き込む必要がある場合は、変数の代わりにポインターのベクトルを格納します。たとえば、このベクトルを使用して、通常どおりに変数の計算を実行します(参照ではありません)。これを行うために、私は次の(醜い)方法を思いついた

std::vector<double*> store;
double create_v(double init, double& d)
{
    store.push_back(&d);
    d = init;
}

double varName1 = create_v(0.05,varName1);

1)同じことを行う読みやすさのためのテンプレート/ブーストを使用したこれのより良い実装があるか、または2)私のようなC ++初心者が知っておくべき別の方法がありますか?3)上記のオーバーヘッドを最小限に抑えることを考慮していない最適化(-O2と-O3でテストし、g ++ 4.7.2を使用します)

4

2 に答える 2

1

g++ の 4.7.2 バージョンは、C++11 の初期化リストのサポートを提供します。これは、次のコードを記述して、すべての変数を に配置できることを意味します。vector<double>

vector<double> vec = {varName1, varName2, varName3, ..., varNameN};

これはかなりきれいで、出力目的で変数をベクトルに編成する簡単な方法を提供するはずです。これはideone の小さなデモです

PSポインタではなく参照をプッシュバックしているため、3番目の例は機能しません。ただし、これはコンパイル時エラーのはずです。

于 2013-03-17T06:47:36.857 に答える
0

あなたの説明に基づいて、C スタイルの構造体を使用することが許容される場合があります。特定の制限 (Plain Old Data 制限、または POD) を満たす構造体の特定の動作を利用して、その動作をさらに簡素化できます。

POD 構造体には、既定のコンストラクター、デストラクター、またはコピー コンストラクター (コンパイラによって提供される既定値を除く) を含めることはできません。また、仮想メソッド、ポインターまたは参照型のメンバーを含めることもできません。これはそれほど難しくなく達成できるはずです。

これが完了すると、次のような構造体を宣言できるようになります。

struct DataSet
{
    double foo;
    double bar[48]; // arrays are legal in POD types
    // snip however many more declarations
};

これらの構造を次のようなファイルに保存できます。

DataSet ds;
// populate and process dataset
ofstream outputfile("somefile.dat", ios_base::out);
outputfile.write((char *) &ds, sizeof(DataSet));

それらを読むと、期待どおりに機能します。書くのとは逆です。オブジェクトを作成し、ファイルの内容をそこに丸呑みするだけです。の配列のDataSet操作も同様に直感的です。

于 2013-03-18T02:36:02.030 に答える