私は、多くの場合、多次元配列を扱う、そして基になるデータをコピーせずstd::vector
またはstd::vector
さんのstd::vector
が、基準を使用してインスタンス化することはできませんので、私は、std::vector
の大ファンではありません。unique_ptrをするのは
一次元アレイの場合、私は
template<typename T>
using deleted_aligned_array = std::unique_ptr<T[], std::function<void(T*)> >;
template<typename T>
deleted_aligned_array<T> deleted_aligned_array_create(size_t n) {
return deleted_aligned_array<T>((T*)_mm_malloc(n*sizeof(T),16), [](T* f)->void { _mm_free(f);});
}
これは非常に便利であり、私はまた、ゼロの大きさのために働く動的サイズの配列をインスタンス化することができ、次の使用します。さらに、std::forward
を使用して、コピーせずにデータを渡すことができます。 2次元配列の場合
、私は
template<typename T>
using deleted_aligned_array2 = std::unique_ptr<T*,std::function<void(T**)>>;
template<typename T>
deleted_aligned_array2<T> deleted_aligned_array_create(size_t m, size_t n) {
auto arr = deleted_aligned_array2(new T*[m](), [&](T** x) {
if (malloc_usable_size(x) > 0) {
_mm_free(&(x[0][0]));
}
delete[] x;});
if (m*n > 0) {
arr.get()[0] = (T*) _mm_malloc(m*n*sizeof(T),16);
// Row pointers
for (size_t iRow = 1; iRow < m; iRow++) {
(m_data.get())[iRow] = &(m_data.get()[0][iRow*n]);
}
}
return arr;
}
それはゼロサイズの配列のために働くような何かをしたいと思いますが、私は、明白な理由のためにvalgrind
からinvalid read of size 8
をエラーが発生します。
std::unique_ptr
メンバを保持してクラス全体を作成せずに、これを優雅な方法で解決することは可能ですか?私はmove-constructor、move-assignmentなどを実装します。最終的に、これを一般化して寸法
template<typename T, size_t Dim>
deleted_aligned_array<T,D> deleted_aligned_array_create(...);
返される配列を再帰的に初期化行ポインタユニークなポインタであるべきであり、それは、例えばゼロサイズの配列をサポートしなければなりません
auto arr = deleted_aligned_array_create<float,3>(4,5,10);
は、行と列のポインタを持つ3次元配列を返します。
問題: 1)簡単な方法で無効なデータを読み込まないようにしてください。 2)テンプレートのパラメータD
を使用して、T*
,T**
の型を生成し、単純にD
を渡して、再帰的に行ポインタを生成するコードに渡します(既にこれがあります)。 3)ポータブルな方法で行うのが好ましい。サイズは、私は一種の解決策を見つけたが、それは非常にエレガントではありません事前
STDの* "STD ::ベクターまたはスタンダード::ベクトルとすることができる::コピーせずに参照を使用して、ベクトルの基礎となるデータ "*あなたはどういう意味ですか? – Jarod42
多次元配列を実装する良い方法は、配列を平坦化し、インデックスを "手動で"計算することです。 – Jarod42
インスタンスを作成する必要がある関数の引数型としてstd :: vectorを使用したい場合は、これがコピーを発行します。私はしばしば多次元配列のサブアレイを使い、コピーを避けたい。 –