#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);
}我是一本c lang入门书。当我阅读开源时,我看到了这个函数。但这是什么功能呢?我以前从未见过这种功能。av_alloc_size(1, 2)和*av_mallocz_array有什么关系吗?
发布于 2017-07-03 07:02:18
它只是一个宏,扩展到GCC特有的属性(__attribute__((alloc_size()))),进一步“描述”该函数。来自GCC文献
alloc_size alloc_size属性用于告诉编译器函数返回值指向内存,其中大小由一个或两个函数参数指定。GCC利用这些信息来提高
__builtin_object_size的正确性。 表示分配大小的函数参数由提供给属性的一个或两个整数参数指定。分配的大小要么是指定的单个函数参数的值,要么是指定的两个函数参数的乘积。参数编号从一个开始。 例如, 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()展开为零(空字符串)。
https://stackoverflow.com/questions/44879476
复制相似问题