gpt4 book ai didi

c - BoehmGC - 了解内存分配器 GC_malloc

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:40:03 26 4
gpt4 key购买 nike

我在理解 BoehmGC 分配方案 - GC_malloc 时头晕目眩。我不知道它是如何分配内存的,没有看到 GC_malloc 内部调用的任何 malloc 或 mmap。

有人可以帮助我吗?任何链接或代码片段都会有很大帮助。

非常感谢。 Boehm GC source code

 enter code here
254 /* Allocate lb bytes of composite (pointerful) data */
255 #ifdef THREAD_LOCAL_ALLOC
256 void * GC_core_malloc(size_t lb)
257 #else
258 void * GC_malloc(size_t lb)
259 #endif
260 {
261 void *op;
262 void **opp;
263 size_t lg;
264 DCL_LOCK_STATE;
265
266 if(SMALL_OBJ(lb)) {
267 lg = GC_size_map[lb];
268 opp = (void **)&(GC_objfreelist[lg]);
269 LOCK();
270 if( EXPECT((op = *opp) == 0, 0) ) {
271 UNLOCK();
272 return(GENERAL_MALLOC((word)lb, NORMAL));
273 }
274 /* See above comment on signals. */
275 GC_ASSERT(0 == obj_link(op)
276 || (word)obj_link(op)
277 <= (word)GC_greatest_plausible_heap_addr
278 && (word)obj_link(op)
279 >= (word)GC_least_plausible_heap_addr);
280 *opp = obj_link(op);
281 obj_link(op) = 0;
282 GC_bytes_allocd += GRANULES_TO_BYTES(lg);
283 UNLOCK();
284 return op;
285 } else {
286 return(GENERAL_MALLOC(lb, NORMAL));
287 }
288 }

最佳答案

有两种可能:

  • 它返回一个由GENERAL_MALLOC给出的指针(两次返回)
  • 它设置op = *opp(带有EXPECT 的行)然后它返回op。我会说,第二个是重用释放的 block 。

对于第二种情况:查看if之前的opp的值:

opp = (void **)&(GC_objfreelist[lg]);

opp 中有一个指向“空闲”对象列表的指针。

if 可能会检查该列表中是否有任何 block 。如果没有 (== 0),则它使用 GENERAL_MALLOC

关于c - BoehmGC - 了解内存分配器 GC_malloc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7332412/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com