1

typedefboost ライブラリを使用して多次元配列にしたいと考えています。行列は長方形で、各次元の次元と長さは 内で固定する必要がありますtypedef。ベクトルの場合、これはまさにboost::arrayテンプレート クラスによって解決されるものでした。

typedef boost::array<int, 3> vec3_t;

多次元配列の場合、この構造を繰り返すことができます

typedef boost::array<boost::array<int, 2> ,3> mat2x3_t

また、マトリックスを非常にうまく初期化することもできます(ただし、この動作が保証されているかどうかはわかりません...):

Mat2x3_t m = { 11, 12, 13,
               21, 22, 23};

ただし、パフォーマンスの観点からは、これがうまくいくかどうかはわかりません。メモリ管理に関する私の理解は非常に限られていますが、コンピューターのメモリでこれを想像する方法は、最も内側の配列 (boost::array<int, 2>上記の例では) がメモリの連続したブロックを割り当てることが保証されているのに対し、「より高いレベル」の場合です。よくわかりません。

また、クラスも調べましたboost::multi_array。私の理解では、マトリックス全体が連続したメモリ ブロックを占有し、私が興味を持っている「四角形」のマトリックスには非常に理想的です。私の実装にとって重要ではありませんが、それでもなお良い追加です)。ただし、このクラスの取引ブレーカーはtypedef、各次元の長さではなく、次元の数だけであるということです。

だから私の質問は次のとおりです。複数の配列の観点からの構築は、それを何度も繰り返す必要がある場合(〜10 ^ 7回)、パフォーマンスの問題を引き起こしますか?私の例では 2x3 の int 行列を使用しましたが、ユースケースは複素数を持つ高次元の 64x4x2 行列です。また、中括弧に関する初期化は実装によって保証されていますか? 配列に問題がある場合、固定サイズの multi_array を typedef する方法はありますか? または、私が見逃している他の選択肢はありますか?

4

1 に答える 1

2

boost::array<T, N>(現代のいとこのようにstd::array<T, N>) は、データ メンバーを 1 つだけ持つように定義されています。

// public data members
T elems[N];

これは Ts の連続シーケンスです。各 T が順番に配列である場合、全体が連続しています (技術的には、 の前後にパディングが原因でギャップが生じる可能性がありelemsますが、この場合、先頭のパディングは許可されておらず、末尾のパディングは非現実的です。

ブレースの初期化とブレースの省略は保証されていますが、十分なブレースがないと判断した場合に警告を発するコンパイラもあります。

于 2013-02-09T03:33:31.940 に答える