vector の (論理) メモリ レイアウトを見てみましょう。
[size:4/8 bytes]
[capacity:4/8 bytes]
[other datamembers:n bytes]
*[elements:size*sizeof(element) bytes] << one contiguous memory (pointer to heap)
ベクトルのベクトルを使用すると、次のようになります。
[size:4/8 bytes]
[capacity:4/8 bytes]
[other datamembers:n bytes]
* [
[Vector:0]
[size:4/8 bytes]
[capacity:4/8 bytes]
[other datamembers:n bytes]
*[elements:size*sizeof(element) bytes] << pointer to contiguous memory for elements
[Vector:1]
[size:4/8 bytes]
[capacity:4/8 bytes]
[other datamembers:n bytes]
*[elements:size*sizeof(element) bytes]
[Vector:2]
[size:4/8 bytes]
[capacity:4/8 bytes]
[other datamembers:n bytes]
*[elements:size*sizeof(element) bytes]
...
...
] << contiguous memory of vectors
これは、ベクトルがベクトルを格納する連続したメモリへのポインタを持ち、各ベクトルが要素を格納する連続したメモリを持つ別のヒープを指す要素を格納することを意味します。
しかし、ベクトルで使用されるアロケータを作成して、連続するメモリ ブロックを割り当てることができたとしても、ネストされたベクトルの 1 つが削除されると、メモリが連続しなくなるという問題に直面することになります。ネストされたベクトルのサイズが異なる状況は言うまでもありません。
ユースケースに応じて、ベクトルのベクトルに顧客の連続ブロック メモリ アロケータを使用するか、メモリの 1 つの連続ブロックを手動で割り当ておよび割り当て解除する古い方法で行うことができます。