引用自GCC文档(重点是我的):
malloc属性用于告诉编译器,一个函数可能会被处理为,任何它返回的非空指针在函数返回时不能与任何有效的其他指针别名,并且该内存的内容是未定义的。这通常可以提高优化效果。具有此属性的标准函数包括
malloc
和calloc
。realloc
-like函数没有此属性,因为所指向的内存没有未定义的内容。
我有以下代码:
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
字段设置为它们各自的值。我是否仍然可以将此分配段视为“未定义内容”并使用malloc属性?
calloc
返回具有明确定义内容的内存。 - Kerrek SBcalloc
的内存非常明确定义,因此我认为我也可能存在误解...您能否详细说明一下? - mah