container_of
宏是一個用于獲取結構體實例的指針,通過其成員變量的指針
在 C 語言中,結構體的內存布局是連續的。這意味著結構體中的成員變量在內存中是按照它們在結構體定義中的順序排列的。因此,我們可以通過成員變量的地址來計算出結構體實例的地址。
container_of
宏的實現原理如下:
ptr
的類型大小(sizeof(*ptr)
)。舉個例子,假設我們有以下結構體定義:
struct foo {
int a;
int b;
};
現在,我們有一個指向 b
成員變量的指針 int *ptr
,我們可以使用 container_of
宏來獲取指向結構體實例的指針:
struct foo *instance = container_of(ptr, struct foo, b);
這里,container_of
宏會計算出 b
成員變量在結構體 foo
中的偏移量,然后將 ptr
的地址減去該偏移量,從而得到結構體實例的地址。
總之,container_of
宏與內存布局之間的關系是通過計算成員變量在結構體中的偏移量來獲取結構體實例的指針。這要求結構體的內存布局是連續的,這在 C 語言中是成立的。