1

コード ビハインドと思われるコード ブロックがあります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;
    }
}
4

7 に答える 7

6

mallocの背後にあるコードは、確かにそれよりもはるかに複雑です。いくつかの戦略があります。人気のあるコードの1つは、dlmallocライブラリです。より単純なものはK&Rで説明されています。

于 2009-10-18T01:14:13.077 に答える
4

コードは明らかに不完全です(すべてのパスが値を返すわけではありません)。しかし、いずれにせよ、これは「本物の」mallocではありません。これはおそらく、「malloc」の非常に単純化された「モデル」を実装する試みです。コードの作成者が選択したアプローチは、実際には有用な実用的な実装につながることはありません。

(そしてところで、標準の'malloc'パラメーターの型は'int'ではなく'size_t'です)。

于 2009-10-18T01:18:50.900 に答える
2

そのコードのエラーの1つは、データへのポインターを返さないことです。

そのコードへの最善のアプローチは[削除]だと思います。

于 2009-10-18T01:16:15.320 に答える
1

可能であれば、新しいブロックを取得する必要があるまで、malloc で使用できるコードのブロックがあるため、malloc が異なる要求を互いに近づけようとすることを期待しています。

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

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

独自の malloc 関数を持つさまざまなオープンソース プロジェクトを見つけることができます。不足しているものを把握するには、そのうちの 1 つを参照するのが最善の方法かもしれません。

于 2009-10-18T01:31:42.370 に答える
0

完全な malloc 実装になるには小さい

Visual Studio 6.0 の C ライブラリのソースで llok を取得します。記憶が正しければ、malloc の実装が見つかります。

于 2009-10-19T23:44:26.383 に答える
0

コードは金属マシンで実行されているようです。通常、物理アドレス空間のみを直接使用するシステムでは、仮想アドレス マッピングはありません。

私の理解を参照してください。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;
}

編集:誰かがアルゴを説明するのを手伝ってくれますか?つまり、アドレス -> my_size -> チャンクを変換しますか? reclaim を呼び出すと、free(void *addr) と言うと、このアドレス -> my_size -> チャンク アルゴも使用され、ブロックをヒープに戻した後、それに応じてヒープ [チャンク] を更新します。

于 2009-10-18T14:01:12.967 に答える
0

malloc動的に割り当てられたメモリ用です。これにはsbrk、 、mmap、または Windows および/または他のアーキテクチャの他のシステム機能が含まれます。int heap[10000]コードが不完全すぎるため、何のためにあるのかわかりません。

Effo のバージョンはもう少し理にかなっていますが、別のブラック ボックス関数が導入されget_blockているため、あまり役に立ちません。

于 2009-10-19T01:01:26.390 に答える