【发布时间】:2013-08-31 09:09:48
【问题描述】:
引用GCC documentation(强调我的):
malloc 属性用来告诉编译器一个函数可以 被视为好像它返回的任何非 NULL 指针都不能为任何 当函数返回 并且内存有 未定义的内容。这通常会改善优化。标准 具有该属性的函数包括
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返回具有明确内容的内存。 -
@KerrekSB 因为该属性明确指出内容未定义,并且由于
calloc的内存定义非常明确,我想我也一定是误解了一些东西......你能扩展一下吗? -
我认为该属性是为了帮助进行别名分析。编译器可以假设返回的内存不包含指向现有对象的指针。
-
@Kerrek Seams 合理。我认为手册的措辞很不幸。
-
对一些 gcc 开发人员列表来说可能是一个好问题(以改进该文档)
标签: c gcc attributes malloc