Цитата из Документация GCC (выделено мной):
Атрибут malloc используется, чтобы сообщить компилятору, что функция может обрабатываться так, как если бы какой-либо не-NULL-указатель, который он возвращает, не может другой указатель действителен, когда функция возвращает и что память имеет undefined содержание. Это часто улучшает оптимизацию. стандарт функции с этим свойством включают
malloc
иcalloc
.realloc
-как функции не имеют этого свойства, поскольку память, на которую указывает имеют undefined содержимое.
У меня есть следующий код:
struct buffer {
size_t alloc; // Allocated memory in bytes
size_t size; // Actual data size in bytes
char data[]; // Flexible array member
};
#define ARRAY_SIZE <initial_value>
buffer *buffer_new(void) __attribute__((malloc))
{
struct buffer *ret;
ret = malloc(sizeof(struct buffer) + ARRAY_SIZE);
if (!ret)
fatal(E_OUT_OF_MEMORY);
ret->alloc = ARRAY_SIZE;
ret->size = 0;
return ret;
}
Теперь я немного озадачен: хотя я не инициализировал член data
, я по-прежнему устанавливал поля alloc
и size
в соответствующие значения. Могу ли я считать этот выделенный сегмент "undefined content" и использовать атрибут malloc?