GLib宏g_slice_new问题

时间:2015-07-28 06:44:13

标签: c glib

此问题与GLib进行c编程有关。 原始代码在这里: https://github.com/GNOME/glib/blob/master/glib/gslice.h

在glist.h中,我看到了宏_g_list_alloc0,我想知道它是如何实现的。所以我回溯了。

#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)))

我对最后两个宏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

2 个答案:

答案 0 :(得分:3)

您可以在此处阅读有关属性的信息:https://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html

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

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

答案 1 :(得分:0)

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

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

#define G_GNUC_MALLOC __attribute__((__malloc__))
  

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