GLib宏g_slice_new问题

问题描述:

这个问题与GLib for c programming有关。 原代码在这里: https://github.com/GNOME/glib/blob/master/glib/gslice.hGLib宏g_slice_new问题

在glist.h,我看到了宏观_g_list_alloc0,我想知道它是怎么implements.So我回到正轨。

#define _g_list_alloc0() g_slice_new0 (GList) 

接着,反向跟踪到宏g_slice_new0

#define g_slice_new0(type) ((type*) g_slice_alloc0 (sizeof (type))) 

好吧,反向跟踪到

gpointer g_slice_alloc0 (gsize block_size) G_GNUC_MALLOC G_GNUC_ALLOC_SIZE(1); 

对于G_GNUC_MALLOC,我发现它居然是:

#define G_GNUC_MALLOC __attribute__((__malloc__)) 
#define G_GNUC_ALLOC_SIZE(x) __attribute__((__alloc_size__(x))) 

我对la很困惑st两个宏G_GNUC_MALLOC和G_GNUC_ALLOC_SIZE。

我可以用替换G_GNUC_ALLOC_SIZE(1)和G_GNUC_MALLOC:

__attribute__((__alloc_size__(1))) 
__attribute__((__malloc__)) 

所以,更换宏观

gpointer g_slice_alloc0 (gsize block_size) G_GNUC_MALLOC G_GNUC_ALLOC_SIZE(1); 

宏实际上定义这样的:

gpointer g_slice_allo0 (gsize block_size) 
__attribute__((__malloc__)) __attribute__((__alloc_size__(1))) 

我的问题: 什么表达

__attribute__((__malloc__)) __attribute__((__alloc_size__(1))) 

工作或生成?我猜它可以像

malloc(sizeof()) 

它根据sizeof分配内存。 为什么不使用malloc(sizeof())而不是这个完成的表达式? 什么是

__attribute__ 

?它是否是glib的一个保留关键字?

gpointer g_slice_alloc0 (gsize block_size) G_GNUC_MALLOC G_GNUC_ALLOC_SIZE(1); 

表达式的类型是什么?它不是宏或typedef。 这是一个以函数名为宏的函数吗? 任何人都可以为我分析它?

原路段的位置: https://github.com/GNOME/glib/blob/master/glib/gslice.h

你可以阅读有关的属性在这里:https://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html

malloc一个“告诉编译器,函数是malloc的状”。 alloc_size“用于告诉编译器函数返回值指向内存,其中大小由一个或两个函数参数给出。”

这一切都是为了编译器的优化。这些属性不会改变函数的工作方式,只会让编译器产生更好的输出。

#define G_GNUC_ALLOC_SIZE(x) __attribute__((__alloc_size__(x))) 

展开为GNU C alloc_size功能属性,如果编译器是一个新的足够的gcc。该属性告诉编译器该函数返回一个指向由第x个函数参数指定大小的内存的指针。

#define G_GNUC_MALLOC __attribute__((__malloc__)) 

展开为GNU C malloc函数属性如果编译器是gcc。将函数声明为malloc可以更好地优化函数。如果函数返回一个指针,该指针在函数返回时保证不与别的指针发生别名(实际上,这意味着新分配的内存),则函数可以具有malloc属性。