メモリの一部が残りの部分とリンクするように、連続したメモリ ブロックを使用するにはどうすればよいでしょうか。たとえば、malloc を使用して連続するバイト ブロックを割り当てた場合、ブロックの最初の部分が残りの部分を指すポインタとして構造化されるように構造化します。つまり、ポインターとポインティング オブジェクトは連続している必要があります...??
2 に答える
1 つのタイプのオブジェクトの 2D 配列が必要な場合は、次のように実行できます。
int entries = xSize * ySize; // create a 2D array of xSize by ySize dimensions
size_t buffSize = entries * objectSize; // objectSize is number of bytes for your object
void *block = malloc(buffSize);
2D 配列の任意のエントリにアクセスするには:
void *thingie = block + y * xSize + x;
これで、thingie は x、y に対応するブロックを指します。必要に応じて、メモリ オブジェクトのレイアウトを変更することもできます。上記では、行優先を行いました。あなたがすることができます:
void *thing = block + x * ySize + y;
それは列メジャーになります。上記は n 次元に拡張できます。
int entries = xSize * ySize * zSize; // create a 3D array of xSize, ySize, zSize dimensions
size_t buffSize = entries * objectSize; // objectSize is number of bytes for your object
void *block = malloc(buffSize);
その後:
void *thingie = block + z * ySize * xSize + y * xSize + x;
3D キューブで記録を取得します。これは任意の次元に適用できます。もちろん、大きな次元空間で大きなオブジェクトを処理している場合は、遅かれ早かれメモリを使い果たします。
その質問は私にはあまり意味がありません。サイズ sizeBytes の nItems (つまり、すべて同じサイズ) が必要であると仮定しましょう。ポインタを格納する必要はありません。必要なときにいつでも割り当てられたメモリへのオフセットを計算できるからです。したがって、質問の基準がいくつか不足している可能性があります。これを行う方法は次のとおりです。
void *block = malloc(nItems * sizeBytes);
次に、n-th
オブジェクトに到達するには、次のようにします。
void *myMemory = block + n * sizeBytes;
そこで境界チェックを行いたいと思うでしょう...
しかし、それは簡単すぎるので、単一の malloc で割り当ててアクセスしたいさまざまなサイズの構造体が実際にあると思います。したがって、「メモリのサブブロック」のアドレスが何であるかを理解するだけの問題ではありませんが、後でオブジェクトを理解できるようにキャストする方法を知りたいと思うでしょう (それが C 構造であると仮定します)。 . ですから、私は全体的な質問に混乱していると言わざるを得ないと思います.
おそらく、ポインタ、サイズ、およびメモリの各「サブブロック」が想定される構造のタイプのようなものが必要/必要になるでしょう。これは、ヘッダー情報がおそらくどのように見えるべきかを示します。大まかに言えば、「メタデータ」に必要なストレージを計算してから「ペイロードデータ」を計算し、それらをまとめて malloc する必要があります。
ただし、実装するのは簡単なことではありません。メモリ ブロックを割り当て/初期化する関数に、オブジェクトの組み合わせ (および各サブオブジェクトのレイアウトのシーケンス) をどのように伝えるかを理解する必要があるためです。
残念ながら、この質問は非常に具体的ではありません。