2017-01-25 3 views
0

大きなシステムで古いコードを置き換えるために、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::arraystd::unique_ptrは私の両方のベストを与えるかもしれないことを実現世界?

+1

:興味のある方、関連する宣言について

(私はそう、私はデストラクタが指定されている場合、コンパイラはそれらを生成しませんようにそれらを追加するために必要な仮想デストラクタを追加したいです) 'std :: array'は基本的にCスタイルの配列の内容を移動するのと同じです – qxz

+0

おそらく、そこに多くのマトリックスライブラリの1つを使用しますか? –

+0

Cスタイルの配列はポインタではありません。おそらく動的に割り当てられたメモリへのポインタを考えているでしょう。これは 'std :: vector'がフードの中で使うものです。可能であれば8バイトのオーバーヘッドを節約したい場合を除き、ベクトルを使用してください(サイズと容量を把握する必要があります)。 – juanchopanza

答えて

0

私はjuanchopanzaの助言に従い、std::vectorに行くことにしました。私がすでに質問したところでは(O(1)で)それを移動でき、juanchopanzaが指摘したように、オーバーヘッドは非常に小さいです。

さらに私は、デフォルトで移動操作を宣言してコードの読みやすさを向上させるオプションがあるのが好きです。の内容を移動

/// Copy constructor 
VectorND(const VectorND &) = default; 
/// Move constructor 
VectorND(VectorND &&) = default; 
/// Copy assignment 
VectorND& operator=(const VectorND &) = default; 
/// Move assignment 
VectorND& operator=(VectorND &&) = default; 
/// Destructor 
virtual ~VectorND() = default; 
関連する問題