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属性。