質問
実験中です OpenCL ソフトウェアの速度を上げるため。私たちはマップを頻繁に扱いますが、簡素化するためにマップを std::vector< std::vector > として表します。OpenCL API は、生の C スタイル ポインタを引数として受け取ります。たとえば、上記の場合は int* です。
私の質問:
- ベクトルが内部的にメモリ内で連続しているという stl の実装保証はありますか?
- std::vector を int* に安全にキャストして、それが機能することを期待できますか?
- ベクトルのベクトルの場合でも、これが当てはまると仮定できますか?私は、ベクトルが他の状態データや位置合わせの問題、あるいはおそらく何か他のものを保持していると予想します...
- これに取り組む最善の方法は何でしょうか?内部の連続したメモリ内バッファを保持するカスタム 2D データ構造を作成して、それを操作しますか?ベクトルとの間で何度もコピーする必要があります...
ありがとう。
解決
が実装保証は、ベクターがメモリ内に、内部的に、連続していることをSTLでいますか?
はC ++ 03のように、はい、ベクトルは連続したストレージを使用することが保証されています。 (でC ++ 98は、そこに実装が仮定非連続のストレージを使用することができるように偶発的抜け穴があったが、それは、標準的な2003年の改訂版で固定した - そして実際には実装がはの非連続的に使用しませんストレージ)それはひどいアイデアだろうなぜなら
することができます私は無事* int型にはstd ::ベクトルをキャストし、仕事にそれを期待する?
通常の方法は&v[0]
です。 (&*v.begin()
はおそらくあまりにも動作しますが、私はこれがない100%の信頼性を向上させ、標準でいくつかのふわふわ文言があります思い出しているようだ)。
はありません。なぜあなたは仕事にそれを期待しますか?ベクトルは、クラスです。それはポインタではありません。それだけでがのポインタが含まれています。
はベクトルのベクトルの場合、私はまだこれが成立すると仮定することができますか?私は、ベクターが他の状態データ、またはアラインメントの問題、または多分何か他の...
を保持することを期待します
は、ベクターは、あなたがそれに格納何でも同じ動作をします。もしベクトルのベクトルを作成する場合は、各要素がヒープに割り当てられた配列へのポインタを含むオブジェクトであるヒープに割り当てられた配列へのポインタを含むオブジェクトで終わる。
あなたはこれにアプローチする方法については、それは多くの要因に依存します。あなたの総データセットがどのくらいありますか?あなたは連続して割り当てられたテーブル全体を持っている場合があります。ベクトルのベクトルと、各列は別個の割り当てである。
他のヒント
- ベクターが stl に実装されている保証はありますか?
内部的に、メモリ内で連続して
はい、動的配列です。標準では、ベクトル内のオブジェクトが連続して格納されることが保証されます。
- std::vector を int* に安全にキャストして、それが機能することを期待できますか?
いいえ、しかし begin() を使用してそれをポインターとして使用することはできます。
- ベクターが stl に実装されている保証はありますか?
内部的に、メモリ内で連続して
いいえ、ベクトルには内部メンバー変数が含まれている可能性があるため、2D 配列全体が連続したメモリ位置にはなりません。
が実装保証は、ベクターがメモリ内に、内部的に、連続していることをSTLでいますか?
このレイアウトを(すなわち、 POCO <想定した高品質のライブラリで、私はここの規格を引用することはできませんが、私が見てきたコード/>)。
することができます私は無事* int型にはstd ::ベクトルをキャストし、仕事にそれを期待する?
具体的には、ベクター自体を作り直すことはできません。しかし、私は次のコードを見てきます:
std::vector<int> vec;
int* ptr = &vec[0];
はベクトルのベクトルの場合、私はまだこれが成立すると仮定することができますか?私は、ベクターが他の状態データ、またはアラインメントの問題、または多分何か他の...
を保持することを期待します
あなたはおそらく、リニアアレイへのベクトルのベクトルをキャストすることはできません。各ベクターは、その独自のメモリ範囲を予約します、あなたはこれらの範囲の全てが連番のことを期待することはできません。
あなたは2500x2500xsizeof(ダブル)データまでで動作することをコメントで述べました。その場合、私の代わりにベクトルのベクトルの1つのベクトルを使用してお勧めします。ベクターにN×Mの要素を割り当て、あなたがしたい場合は、二次元のインデックスを露出したクラスでラップ。あなたは最小限のオーバーヘッドで、ベクターのすべての利点を取得し、すべてのデータを高速に処理するために連続したメモリに残ってます。