#if AV_GCC_VERSION_AT_LEAST(4,3)
#define av_alloc_size(...) __attribute__((alloc_size(__VA_ARGS__)))
#else
#define av_alloc_size(...)
#endif
/**
* Allocate a memory block for an array with av_mallocz().
*
* The allocated memory will have size `size * nmemb` bytes.
*
* @param nmemb Number of elements
* @param size Size of the single element
* @return Pointer to the allocated block, or `NULL` if the block cannot
* be allocated
*
* @see av_mallocz()
* @see av_malloc_array()
*/
av_alloc_size(1, 2) static inline void *av_mallocz_array(size_t nmemb,
size_t size)
{
if (!size || nmemb >= INT_MAX / size)
return NULL;
return av_mallocz(nmemb * size);
}
我是一本初学者。当我阅读开源时,我看到了这个功能。但是它有什么样的功能呢?我以前从未见过这种功能。 av_alloc_size(1, 2)
和*av_mallocz_array
有任何关系吗?
答案 0 :(得分:3)
它只是一个扩展为特定于GCC的属性(__attribute__((alloc_size()))
)的宏,进一步" 描述"功能。来自GCC documentation:
alloc_size
alloc_size属性用于告诉编译器函数返回值指向内存,其中大小由一个或两个函数参数给出。 GCC使用此信息来提高
__builtin_object_size
的正确性。表示分配大小的函数参数由提供给属性的一个或两个整数参数指定。分配的大小是指定的单个函数参数的值或指定的两个函数参数的乘积。参数编号从一开始。
例如,
void* my_calloc(size_t, size_t) __attribute__((alloc_size(1,2))) void* my_realloc(void*, size_t) __attribute__((alloc_size(2)))
声明
my_calloc
返回由参数1和2的乘积给出的大小的内存,并且my_realloc
返回由参数2给出的大小的内存。
因此,简而言之,它有助于编译器更好地理解"代码通过让它知道函数执行动态内存分配,如标准函数malloc()
和calloc()
。代码当然也可以在没有它的情况下工作。
这些行:
#if AV_GCC_VERSION_AT_LEAST(4,3)
#define av_alloc_size(...) __attribute__((alloc_size(__VA_ARGS__)))
#else
#define av_alloc_size(...)
#endif
确保只在使用GCC 4.3或更高版本进行编译时才会进行扩展。在所有其他情况下,第二个#define
只会使av_alloc_size()
扩展为空(空字符串)。