Действительно ли GC_MALLOC соответствует calloc()?

#c #garbage-collection #boehm-gc

#c #сборка мусора #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:

Так GC_MALLOC_ATOMIC следует использовать для замены malloc и GC_MALLOC следует использовать для замены calloc ? Это так?

Нет.

Вы правы, что GC_MALLOC_ATOMIC() похоже malloc() на то, что malloc() не гарантирует очистки выделенного пространства, тогда как GC_MALLOC() похоже calloc() на то, что оно действительно очищает выделенное пространство, но в самом общем смысле вы должны заменить оба malloc() и calloc() на GC_MALLOC() . Это потому, что,

  1. GC_MALLOC_ATOMIC() документирует это ограничение:

    Клиент обещает, что результирующий объект никогда не будет содержать никаких указателей.

  2. Объекты, которые действительно содержат указатели, должны быть очищены при выделении, чтобы GC мог быть уверен в своей интерпретации этих объектов при сканировании их на предмет указателей.

С другой стороны, обычно есть некоторые знания об использовании выделяемого пространства, и когда это происходит, GC_MALLOC_ATOMIC() предпочтительнее для объектов, которые не содержат указателей. Это потому, что GC не будет (никогда) тратить время на сканирование результирующих объектов на предмет указателей. Если вы хотите, чтобы результаты были заполнены нулем, то сделайте это вручную, позже. memset() является распространенным средством для этого.