C++での連続メモリの意味は何ですか?
4 に答える
これは、メモリが単一のチャンクとして割り当てられることを意味します。これは、コンテナについて話すときに最もよく使用されます。
たとえば、vector
andstring
クラスは連続したメモリチャンクを使用します。つまり、要素、、、を含むベクトルがある場合、int
ベクトル123
の最初の要素へのポインターを取得すると、このポインターをインクリメントすることで、2番目の要素(456)にアクセスできることを保証できます。もう一度インクリメントすると、最後の要素(789)にアクセスできます。456
789
std::vector<int> vec = {123, 456, 789};
int* ptr = &vec[0];
*ptr++ == 123; // is true
*ptr++ == 456; // is true
*ptr++ == 789; // is true
一方、dequeクラスは、連続したストレージを保証しません。これは、同じ要素(123、456、789)を含む両端キューがあり、最初の要素へのポインターを取得した場合、ポインターをインクリメントして2番目の要素にアクセスできるかどうかを確認できないことを意味します。もう一度インクリメントして3番目。
std::deque<int> deque = {123, 456, 789};
int* ptr = &deque[0];
*ptr++ == 132; // true
*ptr++ == 456; // not necessarily true and potentially dangerous
*ptr++ == 789; // not necessarily true and potentially dangerous
連続していないデータ構造の別の例は、リンクリストです。リンクリストでは、ヘッドポインタをインクリメントすると2番目の要素が返されることはほとんど考えられません。
コレクションがアイテムの保存方法を気にすることなく管理できるため、ポインターの代わりにイテレーターをできるだけ使用するなど、C++のグッドプラクティスを使用していると仮定すると、関連性はほとんどありません。通常、C ++コードからCコードを呼び出す必要がある場合は、メモリが連続している必要があります。ほとんどのC関数は、連続したメモリで動作するように設計されているため、これが最も簡単な方法です。
以下の文を書くと
int arr[3];
次に、整数型の 3 つの連続したメモリ セルを予約しています。したがって、整数がメモリ内に 4 バイトを予約し、最初のメモリ セルのアドレスが 1000 であるとします。
メモリ内の arr[0] のアドレスは 1000 です
メモリ内の arr[1] のアドレスは 1004 です
メモリ内の arr[2] のアドレスは 1008 です
それらは次々と連続しています。でも、書くだけなら
int a,b,c;
連続していないメモリセルを予約しています。したがって、「a」のアドレスは b および c から遠く離れている可能性があります。例えば
メモリ内の a のアドレスは 1000 です
メモリ内の b のアドレスは 2014 です
メモリ内の c のアドレスは 2234 です
それらは連続していません。それで全部です
まず、連続したメモリとは、占有するアドレスに隙間なく割り当てられたメモリのチャンクを意味します。これは、メモリの 1 つの「ブロック」になります。
C++ の連続したメモリは、C++ で連続したメモリを割り当てるさまざまな方法を意味します。簡単な方法の 1 つは、C のような配列です。
int a[10]
std::vector
やstd::array
(C++11)などの STL コンテナーも連続したメモリを割り当てます。