C++でタイプに依存しないベクトルを作成しようとしていますが、これは2つの方法で区別されます。まず、ヒープ上のオブジェクトの実際の配列を維持するのではなく、少なくとも特定の点までオブジェクト自体のメモリを割り当てます。第2に、C++のコピー/アサインコンストラクタを使用することはできません。これはコードを遅くすると思われ、必要ではありません。C++オブジェクトインスタンスの移動/コピーについて
私は自分のコンピュータで管理しているコードベースを見ている間、LLVMのコードベースのクラスを見つけました。私が探しているものをほぼ完全に記述しています:SmallVector.h。 C++には比較的新しいので、なぜ設計上の決定が下されたのかが完全にはわかりません。たとえば、アレイがT
ではなくU
という形で割り当てられているのはなぜですか?このコメントは手がかりを与えます:
Tにctorまたはdtorがある場合、自動的に実行されないようにするため、スペースを別のものとして表現する必要があります。 charの配列は素晴らしいですが、十分に整列されていない可能性があります。代わりに、スペースのためにいくつかのユニオンインスタンスを使用します。これは、最大限のアライメントを保証します。
U
は、当然のことながら、以下の組合を指し:
union U {
double D;
long double LD;
long long L;
void *P;
} FirstEl;
だから、私は推測し、ここに私の本当の質問は以下のとおりです。なぜT
の配列を割り当てるんコンストラクタ/デストラクタが呼び出されることを意味するもの?これらのコンストラクタ/デストラクタを呼び出さずに、C++オブジェクトインスタンスをベクトルの内側と外側に移動する方法はありますか?私はちょうどLLVMのSmallVector
実装を使用することができますが、私はそれを理解せずにコードを使用して嫌いです。
ベスト、 デュアン
'C++のコンストラクタをコピー/代入すると、コードの速度が遅くなっているようです...' _correct_コードは必要なので、作成します。それらがmemcopiedされている場合はクラッシュするいくつかのクラスがあり、_not_にはデフォルトのコンストラクタがありません。 –