質問

私はmallocの背後にあるコードであるように思わコードブロックを持っています。私はコードを行くように。しかし、私は、コードの一部が欠けているという感覚を得ます。欠けている機能の一部がある場合、誰も知っていますか? mallocは常に一緒に、隣接するチャンクを組み合わせていますか?

int heap[10000];
void* malloc(int size) {
int sz = (size + 3) / 4;
int chunk = 0;
if(heap[chunk] > sz) {
    int my_size = heap[chunk];
    if (my_size < 0) {
      my_size = -my_size
    }
    chunk = chunk + my_size + 2;
    if (chunk == heap_size) { 
      return 0;
    }
}
役に立ちましたか?

解決

mallocの背後にあるコードは確かにはるかに複雑よりです。いくつかの方法があります。 1つの一般的なコードは dlmalloc のライブラリです。簡単一方はK&Rに記載されている。

他のヒント

のコードは、(すべてではないパスが値を返す)不完全明らかです。しかし、いずれにしても、これは「本物」のmallocではありません。これはおそらく、「malloc関数」の非常に単純化「モデル」を実現しようとする試みです。コードの作者が選ばれたアプローチは、本当に便利な実用化にはつながらないことができます。

(そして、ところで、標準size_t型 'ない 'int型'「malloc関数のパラメータの型を持っている')。

まあ、そのコード内の1つの誤りが、それはデータへのポインタを返さないということです。

私はそのコードへの最善のアプローチは、[削除]である疑います。

可能な場合、私はmalloc関数は、それが新しいブロックを取得するためになるまで、それは、malloc関数のために利用可能なコードのブロックを持っているように、互いに近接して異なる要求を置くしようと期待しています。

しかし、それはまた、OSやハードウェアアーキテクチャによって課される要件に依存します。あなただけのコードの特定の最小サイズを要求することが許可されている場合、それは、各割り当てが互いに近くにないということかもしれません。

他の人が述べたように、コードスニペットに問題がある。

あなたは、自分のmalloc関数を持っているさまざまなオープンソースプロジェクトを見つけることができ、それが欠けているもののアイデアを得るために、それらの一つを見て最善のかもしれません。

mallocの動的に割り当てられたのメモリのためです。そして、これは、Windowsおよび/または他のアーキテクチャのためにsbrkmmap、または多分いくつかの他のシステム機能を必要とします。私は、コードがあまりにも不完全であるとして、あなたのint heap[10000]が、何のためにあるのかわからない。

Effoのバージョンは少しより多くの意味を作るが、それはあまり助けにならないように、それは、他のブラックボックス機能get_blockを紹介します。

は、コードのみ直接物理アドレス空間を使用するようなシステム上で正常にない仮想アドレスマッピング、金属マシン上で実行しているように見える。

私の理解を参照してください、32ビットシステム上で、はsizeof(PTR)= 4バイト

extern block_t *block_head; // the real heap, and its address 
                            // is >= 0x80000000, see below "my_size < 0"
extern void *get_block(int index); // get a block from the heap 
                                   // (lead by block_head)
int heap[10000]; // just the indicators, not the real heap

void* malloc(int size) 
{
    int sz = (size + 3) / 4; // make the size aligns with 4 bytes,
                             // you know, allocated size would be aligned.
    int chunk = 0; // the first check point
    if(heap[chunk] > sz) { // the value is either a valid free-block size 
                           // which meets my requirement, or an 
                           // address of an allocated block
        int my_size = heap[chunk]; // verify size or address
        if (my_size < 0) { // it is an address, say a 32-bit value which 
                           // is >0x8000...., not a size. 
              my_size = -my_size // the algo, convert it
        }
        chunk = chunk + my_size + 2; // the algo too, get available 
                                     // block index
        if (chunk == heap_size) { // no free chunks left
           return NULL; // Out of Memory
        }
        void *block = get_block(chunk);
        heap[chunk] = (int)block;
        return block;
    }
    // my blocks is too small initially, none of the blocks 
    // will meet the requirement
    return NULL;
}

EDIT:アドレスを変換する、あるALGOを説明するためでした誰かの助け - > my_size - >チャンク? > my_size - - あなたは、それがこのアドレス使用しますコール・再利用は、無料(void *型のADDR)を言うとき、知っている。それに応じて後のヒープにブロックを返し、ヒープ[チャンク]を更新するには、あまりにもアルゴ>チャンクを

小型に全体のmalloc実装されるように

私はそれを正しく覚えていれば、のVisual Studio 6.0のCライブラリのソースで見てください、あなたは、malloc関数の実装があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top