我正在尝试将g_idle_add()用于需要多个参数的函数。我可以以某种方式内联传递它们,还是必须为此创建一个结构?
主要目标是减少内存消耗,其他一切都是次要的。
static gboolean checker(gpointer plugin, int toggle){
...
return FALSE;
}
g_idle_add(checker, ??? plugin, 0 ??? );
答案 0 :(得分:3)
传递给g_idle_add的函数需要具有与GSourceFunc类型匹配的签名,这意味着它必须只接受一个指针参数。您必须在堆上分配一个结构(不是作为评论者建议的堆栈,只有在创建它的函数运行时才有效)包含您需要的信息。像这样:
struct checker_arguments {
gpointer plugin;
int toggle;
};
static gboolean checker(gpointer data) {
struct checker_arguments *args = data;
/* Do stuff with args->plugin and args->toggle */
g_slice_free1(args, sizeof(*args));
return FALSE;
}
struct checker_arguments *args = g_slice_alloc(sizeof(*args));
args->plugin = plugin;
args->toggle = 0;
g_idle_add(checker, args);
由于您关注内存消耗,我在此示例中使用slice allocation而不是普通heap allocation。对于固定大小的对象,切片分配更有效。