2

重複の可能性:
std :: vector要素は連続していることが保証されていますか?

要素をメモリに連続して格納すると言われているように、人々がC++のベクトルを使用してMPI操作のデータを送受信する手法に出くわしました。

ただし、特にベクトルが特定のサイズに成長し、この仮定が崩れる可能性がある場合に、このアプローチが任意のサイズのベクトルに対して堅牢であり続けるかどうかについては懐疑的です。

以下は私が話していることの例です:

MPI_Recv( &partials[0] , partials.size() , mpi_partial , 0, 
         DALG_ELIMINATE_REQ_MSG ,MPI_COMM_WORLD , &status );
4

3 に答える 3

5

はい、サイズに関係なく、C++ ベクトルは常に連続しています。

しかし、それは、縮小または拡大してもメモリ内を移動しないという意味ではありません...

于 2011-09-30T10:40:15.197 に答える
3

C++ ワーキング ドラフト ( www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3126.pdf ) は 23.4.1 で次のように述べています。

ベクトルの要素は連続して格納されます。つまり、T が bool 以外の型の場合、v がベクトルである場合、すべての 0 <= n < v に対して恒等式 &v[n] == &v[0] + n に従います。 。サイズ()。

于 2011-09-30T10:46:50.160 に答える
1

基本的に、はい。私が知っているすべての実装はそうであり、標準では、基本的に連続したメモリブロックを必要とする O[1] ルックアップを持つベクトルが必要です。

標準の「実装の詳細に依存しないでください」という免責事項。

于 2011-09-30T10:42:20.490 に答える