GC_MALLOC на самом деле соответствует calloc ()? - PullRequest
0 голосов
/ 15 марта 2019

Согласно инструкции, 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 голосов
/ 15 марта 2019

Таким образом, 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() - это обычное средство для этого.

...