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