【问题标题】:malloc code in CC中的malloc代码
【发布时间】:2009-10-18 01:08:10
【问题描述】:

我有一个似乎是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;
    }
}

【问题讨论】:

  • 格式化确实有助于您的问题和您的代码。
  • ...我尝试解决语法和清晰度问题...
  • @Chris Lutz - 很抱歉。 :)

标签: c malloc implementation heap-memory


【解决方案1】:

malloc 背后的代码肯定比这复杂得多。有几种策略。一种流行的代码是dlmalloc 库。 K&R 中描述了一种更简单的方法。

【讨论】:

    【解决方案2】:

    代码显然不完整(并非所有路径都返回值)。但无论如何,这不是一个“真正的”malloc。这可能是尝试实现高度简化的“malloc”“模型”。代码作者选择的方法并不能真正导致有用的实际实现。

    (顺便说一句,标准的“malloc”参数的类型为“size_t”,而不是“int”)。

    【讨论】:

      【解决方案3】:

      好吧,该代码中的一个错误是它没有返回指向数据的指针。

      我怀疑该代码的最佳方法是[删除]。

      【讨论】:

      • 当我们谈到这个主题时,另一个错误是该函数没有右括号,第三个错误是malloc() 采用size_t 参数,而不是int(和当然不是任何有符号的类型)。
      【解决方案4】:

      如果可能,我希望 malloc 会尝试将不同的请求彼此靠近,因为它会有一个可供 malloc 使用的代码块,直到它必须获得一个新块。

      但是,这也取决于操作系统和硬件架构的要求。如果您只被允许请求某个最小大小的代码,那么每个分配可能不会彼此靠近。

      正如其他人提到的,代码 sn-p 存在问题。

      您可以找到各种具有自己的 malloc 功能的开源项目,最好查看其中一个,以便了解缺少的内容。

      【讨论】:

        【解决方案5】:

        malloc 用于动态分配内存。这涉及sbrk、mmap,或者可能是Windows 和/或其他架构的一些其他系统功能。我不确定你的int heap[10000] 是干什么用的,因为代码太不完整了。

        Effo 的版本有点意思,但后来又引入了另一个黑盒函数get_block,所以没有多大帮助。

        【讨论】:

          【解决方案6】:

          代码似乎是在金属机器上运行的,在这种只直接使用物理地址空间的系统上通常没有虚拟地址映射。

          看我的理解,在 32 位系统上,sizeof(ptr) = 4 bytes:

          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 -> 块算法,在将块返回堆后相应地更新堆[块]。

          【讨论】:

            【解决方案7】:

            小到成为一个完整的 malloc 实现

            看看Visual Studio 6.0的C库的源码,如果我没记错的话,你会发现malloc的实现

            【讨论】:

              猜你喜欢
              • 2014-01-23
              • 2017-10-03
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-05-02
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多