4

コンパイル時に一連の数値を計算し、それらを静的ベクトルとして格納することで、計算時間を節約しようとしています (ただし、今のところ、ランタイムの開始時に 1 回計算することに落ち着くかもしれません)。私がやろうとしていることの簡単な(コンパイルではない)例は次のとおりです。

#include <vector>
using namespace std;

static vector<vector<int> > STATIC_THING(4, vector<int>(4));

void Generator(int x, int y, vector<int> *output) {
  // Heavy computing goes here
  for(int i=0; i < 4; ++i)
    (*output)[i] = x * y;
  return;
}   
static void FillThings() {
  for(int x=0; x < 4; ++x)
    for(int y=0; y < 4; ++y)
      Generator(x, y, &STATIC_THING[x]);
}   
FillThings();

int main() {
}   

シーケンスを事前計算して配列にハードコーディングする以外に、コンパイラにこれを処理させる方法はありますか? 少なくとも、これが存在するヘッダーの最初の #include でこれを実行する方法があるはずですが、クラスでしか実行されていません。コンパイル時の計算が容易になる場合は、ベクトルの代わりに配列を使用できます。

編集:

  • テンプレートのメタプログラミングが提案されましたが、実際のジェネレーター アルゴリズムは複雑すぎて、この手法には向いていません。

  • ルックアップ テーブルを使用することは、実行時の計算を回避できる唯一の他のオプションのようです。今後もパフォーマンスが問題になる場合は、これに頼ります。

4

3 に答える 3

5

これを行う:

static int FillThings() {
  for(int x=0; x < 4; ++x)
    for(int y=0; y < 4; ++y)
     Generator(x, y, &STATIC_THING[x]);
  return 9087;
}   
static int q = FillThings();
于 2012-08-27T15:58:38.160 に答える
2

ブレース初期化子を介して実際のリテラルから初期化できない場合は、次のようにすることができます。

typename std::vector<std::vector<int>> my_vector;

static my_vector make_static_data()
{
    my_vector result;
    // ... populate ...
    return result;
}

static const my_vector static_data = make_static_data();
于 2012-08-27T16:03:25.517 に答える
0

それほど簡単ではありません: std::vector は動的構造です。「コンパイル時間」では「入力可能」ではありません。実際にベクターを埋める呼び出し関数またはラムダの戻り値で静的変数を初期化することにより、起動時にそれを埋めることができます。

これは方法かもしれません。

しかし、適切な「コンパイル時vecotr」は、「インデックス」がパラメーターとして与えられたintであるテンプレートのように見える必要があります。

template<unsigned idx>
struct THING
{
    static const int value = .... //put a costant expression here
};

として使用するTHING<n>::value

「定数式」はfunction(THING<idx-1>::value)、再帰的に特殊な

temnplate<>
struct THING<0U> {};

これにより、コンパイラの再帰が停止します。

ただし、いくつかの制限があります。value静的メンバーを定義する式は constexpr でなければならず (したがって、整数型、組み込み演算と no のみ<cmath>、および constexpr で宣言された関数のみ)、 as として使用される値はidxそれ自体でなければなりません定数 (変数ではない)。

于 2012-08-27T16:08:53.207 に答える