Таким образом, GC_MALLOC_ATOMIC
следует использовать для замены malloc
и GC_MALLOC
следует использовать для замены calloc
?Так ли это?
Нет.
Вы правы в том, что GC_MALLOC_ATOMIC()
похож на malloc()
в том, что malloc()
не гарантирует очистки выделенного пространства, тогда как GC_MALLOC()
похоже на calloc()
в том смысле, что оно очищает выделенное пространство, но в самом общем смысле вы должны заменить и malloc()
и calloc()
на GC_MALLOC()
.Это связано с тем, что
GC_MALLOC_ATOMIC()
документирует это ограничение: Клиент обещает, что полученный объект никогда не будет содержать указателей.
- Объекты, которые содержат указатели, должны быть очищены при выделении, чтобы GC мог быть уверен в своей интерпретации этих объектов при сканировании их на наличие указателей.
С другой стороны, обычно у кого-то есть знания оиспользование пространства, которое каждый выделяет, и когда это происходит, GC_MALLOC_ATOMIC()
должно быть предпочтительным для объектов, которые не содержат указателей.Это потому, что GC не будет (никогда) тратить время на сканирование результирующих объектов на наличие указателей.Если вы хотите, чтобы результаты были заполнены нулями, сделайте это вручную, потом.memset()
- это обычное средство для этого.