ベクターは通常、データを格納するために必要なスペースよりも多くのスペースを割り当て、ベクターはEigen::Vector3f
サイズを変更するたびにデフォルトのコンストラクターとデストラクタを呼び出すため、おそらくより多くのメモリを消費します。私の知る限り、デフォルトのEigen::Vector3f
コンストラクターは空であるため、リリース ビルドではコストがかかりません (ただし、これとデバッグ イテレーターが原因で、デバッグ ビルドでパフォーマンスの問題が発生する可能性があります)。反対に、Eigen::Matrix
サイズを変更するたびにメモリを再割り当てします ( std::vector
conservativeResize を使用した場合と同様に、コンテンツもコピーします)。これは低速です。
ただし、より便利なので、ベクトルを使用することをお勧めします。要素を動的に追加し、再割り当てせずにサイズを変更できます。ベクターで標準アルゴリズムを使用する方が簡単です。ベクトルが必要以上にメモリを消費しないようにしたい場合は、次のトリックを使用してサイズを変更できます。
std::vector<Eigen::Vector3f> vertices;
vertices.swap( std::vector<Eigen::Vector3f>(size, Eigen::Vector3f()) );
または、shrink_to_fitを参照してください
はい、memcpy を使用して、両方の表現を使用してデータを効率的にコピーできます。しかし、を使用std::copy
すると、リリース ビルドで同じパフォーマンスで同じ仕事ができます (場合によっては、コンパイラによって置き換えられることもありますmemcpy
)。
ただし、それでもパフォーマンスに満足できない場合は、そのような場合に自分で決定を下すためのヒントを次に示します。
- 頂点配列のサイズを頻繁に変更する場合 (要素の追加または削除) ->
std::vector
頻繁な再割り当てを避けるために使用します。
- 頂点配列に大量のデータを格納する場合 ->
Eigen::Matrix
過度のメモリ消費を避けるために使用します。
- デバッグ モードでのパフォーマンスに満足できない場合 (これは、頂点配列のデータを頻繁に処理する場合に幸いにも当てはまります) -> を使用すると
Eigen::Matrix
、stl
デバッグ イテレータによってパフォーマンスが低下する可能性があります (MSVC の場合のみ当てはまります)。
また、boost::shared_array (scoped_array) も検討してください。これらは、余分なメモリを消費せずに大量のデータを保存するように特別に設計されています。それらを使用すると、シナリオでより理にかなっています。