gpt4 book ai didi

c - GLib宏g_slice_new问题

转载 作者:太空宇宙 更新时间:2023-11-04 07:07:13 27 4
gpt4 key购买 nike

这个问题与用于 C 编程的 GLib 有关。原代码在这里: 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

最佳答案

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

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

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

关于c - GLib宏g_slice_new问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31669107/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com