container of 的的的原理

2021-06-27 09:36:07 字數 1572 閱讀 7985

另外一篇,同樣精彩,

揭開linux核心中container_of的神秘面紗

華清遠見嵌入式學院講師。

在linux 核心中有乙個大名鼎鼎的巨集container_of(),這個巨集是用來幹嘛的呢?我們先來看看它在核心中是怎樣定義的。

呵呵,乍一看不知道是什麼東東。

我們先來分析一下container_of(ptr,type,member),這裡面有ptr,type,member分別代表指標、型別、成員。看乙個例子:

struct test

;struct test temp;

現在呢如果我想通過temp.j的位址找到temp的首位址就可以使用container_of(&temp.j,struct test,j);

現在我們知道container_of()的作用就是通過乙個結構變數中乙個成員的位址找到這個結構體變數的首位址。

下面來看看比較複雜的內容:

我們用上面的struct test張展一下

const typeof(((struct test *)0)->j) * __mptr = (&temp.j);

其中,typeof是gnu c對標準c的擴充套件,它的作用是根據變數獲取變數的型別。因此,上述**的作用是首先使用typeof獲取結構體成員j的型別為int,然後頂乙個int指標型別的臨時變數__mptr,並將結構體變數中的成員的位址賦給臨時變數__mptr。

(struct test *)((char *)__mptr - offsetof(struct test,j));

接著我們來看一下offsetof(struct test,j),他在核心中如下定義

展開(size_t)&((struct test *)0)->j,這是什麼東東?

一開始也不明白,這裡要感謝曹老師老師的熱心幫助,一語驚醒夢中人,呵呵,可以是這樣理解。

其中size_t是整型,那麼我們可以知道最終的結果是乙個整形值,也就是j相對於0位址的偏移量。也許現在你會問,整出這麼個玩意幹嘛,下面看個列子:

程式執行結果:

發現沒有如果把第二個值 減去最後乙個值,就能得到第乙個值。

在回首一下它:

(struct test *)((char *)__mptr - offsetof(struct test,j));

是不是可以獲得結構體變數temp的首位址呀,是不是太精妙了呀,linux核心中隨隨便便乙個巨集就有如此精妙,呵呵,想想對linux了解非常多的牛人,還有很長一段路。

0

給主人留下些什麼吧!~~

核心中的container of的實現

1 功能 container of是從乙個已知的結構體和其中乙個成員及其該成員的指標,返回該結構體的首位址。字面意思 裝某某成員的容器的位址。2 原型 在linux kernel.h中定義 definecontainer of ptr,type,member ptr就是成員的指標,type是結構體型...

container of 巧妙的巨集定義

include linux kernel.h define container of ptr,type,member include linux stddef.h define offsetof type,member size t tpye 0 member container of 中,第乙個引...

關於container of等巨集的整理

一直很是疑惑container of是什麼意思,最近看了一些資料,整理一下。1 typeof 首先,我們要知道typeof,它是gcc的c語言擴充套件保留字,用於宣告變數型別。typeof的引數可以是兩種形式 表示式或型別。例如 typeof x 這裡假設x是乙個函式指標,這樣就可以得到這個函式返回...