大きなシステムで古いコードを置き換えるために、N次元ベクトルの新しい実装(VectorND
と呼ぶ)を作成しています。 ベクトルサイズはコンパイル時に認識されるため、Cスタイルの配列std::array
およびstd::vector
は、すべてVectorND
クラスの基礎となるデータ構造の実行可能な候補です。cスタイルの配列は、移動セマンティクスから恩恵を受ける固定サイズのデータのstd :: arrayとstd :: vectorよりも優れていますか?
私はベクトルがたくさん回っていることに気付き、新しいVectorND
クラスを効率的に移動できれば、システムに大きなメリットがあると思います。 (私は動き回ることはできませんが、ベクトルはrvalueとしても頻繁に発生することが分かります)
std::vector
クラスは移動セマンティクスをサポートしています。これらの両方のポインタは、VectorND
クラスの単純な移動コンストラクタ/代入演算子を可能にします。しかし、std::array
クラスでは、移動するのにO(n)時間が必要です。この場合、この「最も明白な選択」のように聞こえるのは、実際には最悪です。
残りの2つについては、Cスタイルの配列をメモリの単一のチャンクとして割り当てることができるため、コンパイル時にサイズを知っているという事実を実際に使用します。
私は何かを紛失していますか、は、実際には私のVectorND
クラスのための最高の基礎をなすコンテナです。
(それが新しいSTLクラスが悪化選択であることを奇妙に聞こえる)
EDIT:再び私のポストを通して読んだ後、私はstd::array
へstd::unique_ptr
は私の両方のベストを与えるかもしれないことを実現世界?
:興味のある方、関連する宣言について
(私はそう、私はデストラクタが指定されている場合、コンパイラはそれらを生成しませんようにそれらを追加するために必要な仮想デストラクタを追加したいです) 'std :: array'は基本的にCスタイルの配列の内容を移動するのと同じです – qxz
おそらく、そこに多くのマトリックスライブラリの1つを使用しますか? –
Cスタイルの配列はポインタではありません。おそらく動的に割り当てられたメモリへのポインタを考えているでしょう。これは 'std :: vector'がフードの中で使うものです。可能であれば8バイトのオーバーヘッドを節約したい場合を除き、ベクトルを使用してください(サイズと容量を把握する必要があります)。 – juanchopanza