gpt4 book ai didi

lwn.net 中的container_of 示例代码

转载 作者:行者123 更新时间:2023-11-30 14:46:39 25 4
gpt4 key购买 nike

当看到:

void my_object_release(struct kobject *kobj)
{
struct my_object *mine = container_of(kobj, struct my_object, kobj);

/* Perform any additional cleanup on this object, then... */
kfree (mine);
}

LWN’s The zen of kobjects ,第三个参数kobj似乎不正确。我认为应该是kobject

最佳答案

给定的代码是正确的:第三个参数是指针指向的容器结构成员的名称,而不是其类型,因此kobj是正确的。这个例子有点令人困惑,因为第一个 kobj 与第二个 kobj 对应的东西不同:第一个是调用者作用域中的指针。

这是一个图表,希望能够阐明 container_of 的参数:

container_of(kobj, struct my_object, kobj)
| | |
| | |
\------------+----------+--------------------------------\
| | |
| | |
/-----------------/ | |
| | |
V /-------------/ |
+------------------+ | |
| struct my_object | { | |
+------------------+ V V
+------+ +------+
struct kobject | kobj |; <-- You have a pointer to this, called | kobj |
+------+ +------+
...
};

container_of 允许您传递 kobject 指针并找到包含对象(只要您知道包含对象是什么)——它允许您使用了解“什么”来回答“哪里”。

值得指出的是,container_of 是一个宏,这就是它如何能够完成看似不可能的事情(对于不习惯元编程的开发人员)。

关于lwn.net 中的container_of 示例代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52078200/

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