GC_MALLOC是否实际上对应于calloc()?

时间:2019-03-14 21:11:22

标签: c garbage-collection boehm-gc

根据手册,GC_MALLOC会清除内存,而GC_MALLOC_ATOMIC不会清除内存。

void * GC_MALLOC(size_t nbytes)
Allocates and *clears* nbytes of storage.

void * GC_MALLOC_ATOMIC(size_t nbytes)
Allocates nbytes of storage.

https://www.hboehm.info/gc/gcinterface.html

因此,应该使用GC_MALLOC_ATOMIC来代替malloc,而应该使用GC_MALLOC来代替calloc吗?是吗?

1 个答案:

答案 0 :(得分:0)

  

因此,应该使用GC_MALLOC_ATOMIC来代替malloc,而应该使用GC_MALLOC来代替calloc吗?是吗?

否。

您是正确的,GC_MALLOC_ATOMIC()就像malloc(),因为malloc()不保证清除分配的空间,而GC_MALLOC()就像calloc()它确实会清除已分配的空间,但是在最一般的意义上,您应该将{em> {em> {em}和malloc()都替换为calloc()。这是因为,

  1. GC_MALLOC()记录了此约束:
      

    客户端保证生成的对象将永远不包含任何指针。

  2. 确实包含指针的对象在分配时必须清除,以便GC可以在扫描它们以查找指针时确信其对这些对象的解释。

另一方面,通常对一个人正在分配的空间的使用情况有一些了解,而当一个人这样做时,GC_MALLOC_ATOMIC()对于不包含指针的对象将是首选。这是因为GC不会(永远)花费时间扫描生成的对象以获取指针。如果您希望结果为零填充,请随后手动进行。 GC_MALLOC_ATOMIC()是执行此操作的常用方法。