婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > Linux內(nèi)核宏Container_Of的詳細(xì)解釋

Linux內(nèi)核宏Container_Of的詳細(xì)解釋

熱門標(biāo)簽:貴陽教育行業(yè)電話外呼系統(tǒng) 400電話申請方案 在百度地圖標(biāo)注車輛 威海人工外呼系統(tǒng)供應(yīng)商 寧夏房產(chǎn)智能外呼系統(tǒng)要多少錢 藍(lán)點(diǎn)外呼系統(tǒng) 撫順移動400電話申請 做外呼系統(tǒng)的公司違法嗎 烏海智能電話機(jī)器人

1. 結(jié)構(gòu)體在內(nèi)存中是如何存儲的

int main() 
{ 
 
 Student stu; 
 stu.id = 123456; 
 strcpy(stu.name,"feizhufeifei"); 
 stu.math = 90; 
 stu.PE = 80; 
 printf("Student:%p\r\n",&stu); 
 printf("stu.ID:%p\r\n",&stu.ID); 
 printf("stu.name:%p\r\n",&stu.name); 
 printf("stu.math:%p\r\n",&stu.math); 
 return 0; 
} 

打印結(jié)果如下:

//結(jié)構(gòu)體的地址 
Student:0xffffcbb0 
//結(jié)構(gòu)體第一個(gè)成員的地址 
stu.ID:0xffffcbb0  //偏移地址 +0 
stu.name:0xffffcbb4//偏移地址 +4 
stu.math:0xffffcbd4//偏移地址 +24 


我們可以看到,結(jié)構(gòu)體的地址和結(jié)構(gòu)體第一個(gè)成員的地址是相同的。這也就是我們之前在拒絕造輪子!如何移植并使用Linux內(nèi)核的通用鏈表(附完整代碼實(shí)現(xiàn))中提到的為什么在結(jié)構(gòu)體中要把 struct list_head放在首位。

不太理解的再看下這兩個(gè)例子:

  • struct A { int a; char b; int c; char d; };a 偏移為 0 , b 偏移為 4 , c 偏移為 8 (大于 4 + 1 的 4 的最小整數(shù)倍), d 偏移為 12 。A 對齊為 4 ,大小為 16 。
  • struct B { int a; char b; char c; long d; };a 偏移為 0 , b 偏移為 4 , c 偏移為 5 , d 偏移為 8 。B 對齊為 8 , 大小為 16 。

我們可以看到,結(jié)構(gòu)體中成員變量在內(nèi)存中存儲的其實(shí)是偏移地址。也就是說結(jié)構(gòu)體A的地址+成員變量的偏移地址 = 結(jié)構(gòu)體成員變量的起始地址。

因此,我們也可以根據(jù)結(jié)構(gòu)體變量的起始地址和成員變量的偏移地址來反推出結(jié)構(gòu)體A的地址。

2. container_of宏

#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE*)0)->MEMBER) 
#define container_of(ptr, type, member) ({          \ 
        const typeof(((type *)0)->member)*__mptr = (ptr);    \ 
    (type *)((char *)__mptr - offsetof(type, member)); }) 


??首先看下三個(gè)參數(shù), ptr是成員變量的指針, type是指結(jié)構(gòu)體的類型, member是成員變量的名字。

??container_of宏的作用是通過結(jié)構(gòu)體內(nèi)某個(gè)成員變量的地址和該變量名,以及結(jié)構(gòu)體類型,找到該結(jié)構(gòu)體變量的地址。這里使用的是一個(gè)利用編譯器技術(shù)的小技巧,即先求得結(jié)構(gòu)成員在結(jié)構(gòu)中的偏移量,然后根據(jù)成員變量的地址反過來得出主結(jié)構(gòu)變量的地址。下面具體分析下各個(gè)部分。

3. typeof

首先看下typeof,是用于返回一個(gè)變量的類型,這是GCC編譯器的一個(gè)擴(kuò)展功能,也就是說typeof是編譯器相關(guān)的。既不是C語言規(guī)范的所要求,也不是某個(gè)標(biāo)準(zhǔn)的一部分。

int main() 
{ 
 int a = 5; 
 //這里定義一個(gè)和a類型相同的變量b 
 typeof(a) b  = 6; 
 printf("%d,%d\r\n",a,b);//5 6 
 return 0; 
} 

4. (((type *)0)->member)

((TYPE *)0) 將0轉(zhuǎn)換為type類型的結(jié)構(gòu)體指針,換句話說就是讓編譯器認(rèn)為這個(gè)結(jié)構(gòu)體是開始于程序段起始位置0,開始于0地址的話,我們得到的成員變量的地址就直接等于成員變量的偏移地址了。

(((type *)0)->member) 引用結(jié)構(gòu)體中MEMBER成員。

typedef struct student{ 
 int id; 
 char name[30]; 
 int math; 
}Student; 
int main() 
{ 
 //這里時(shí)把結(jié)構(gòu)體強(qiáng)制轉(zhuǎn)換成0地址,然后打印name的地址。 
 printf("%d\r\n",&((Student *)0)->name);//4 
 return 0; 
} 

5. const typeof(((type * )0) ->member)*__mptr = (ptr);

這句代碼意思是用typeof()獲取結(jié)構(gòu)體里member成員屬性的類型,然后定義一個(gè)該類型的臨時(shí)指針變量__mptr,并將ptr所指向的member的地址賦給__mptr;

為什么不直接使用 ptr 而要多此一舉呢?我想可能是為了避免對 ptr prt 指向的內(nèi)容造成破壞。

6. offsetof(type, member))

((size_t) &((TYPE*)0)->MEMBER)

size_t是標(biāo)準(zhǔn)C庫中定義的,在32位架構(gòu)中被普遍定義為:

typedef unsigned int size_t;

而在64位架構(gòu)中被定義為:

typedef unsigned long size_t;

可以從定義中看到,size_t是一個(gè)非負(fù)數(shù),所以size_t通常用來計(jì)數(shù)(因?yàn)橛?jì)數(shù)不需要負(fù)數(shù)區(qū)):

for(size_t i=0;i<300;i++)

為了使程序有很好的移植性,因此內(nèi)核使用size_t,而不是int,unsigned。((size_t) &((TYPE*)0)->MEMBER) 結(jié)合之前的解釋,我們可以知道這句話的意思就是求出MEMBER相對于0地址的一個(gè)偏移值。

7. (type * )((char * )__mptr - offsetof(type, member))

這句話的意思就是,把 __mptr 轉(zhuǎn)換成 char* 類型。因?yàn)?code> offsetof 得到的偏移量是以字節(jié)為單位。兩者相減得到結(jié)構(gòu)體的起始位置, 再強(qiáng)制轉(zhuǎn)換成 type 類型。

8. 舉例

#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) 
#define container_of(ptr, type, member) ({ \ 
        const typeof( ((type *)0)->member ) *__mptr = (ptr); \ 
        (type *)( (char *)__mptr - offsetof(type,member) );}) 
         
typedef struct student 
{ 
 int id; 
 char name[30]; 
 int math; 
}Student; 
 
int main() 
{ 
    Student stu; 
        Student *sptr = NULL; 
  stu.id = 123456; 
  strcpy(stu.name,"zhongyi"); 
  stu.math = 90; 
        sptr = container_of(&stu.id,Student,id); 
        printf("sptr=%p\n",sptr); 
        sptr = container_of(&stu.name,Student,name); 
        printf("sptr=%p\n",sptr); 
        sptr = container_of(&stu.math,Student,id); 
        printf("sptr=%p\n",sptr); 
        return 0;  
} 


運(yùn)行結(jié)果如下:

sptr=0xffffcb90
sptr=0xffffcb90
sptr=0xffffcbb4

宏展開可能會看的更清楚一些

int main() 
{ 
    Student stu; 
        Student *sptr = NULL; 
  stu.id = 123456; 
  strcpy(stu.name,"zhongyi"); 
  stu.math = 90; 
  //展開替換 
        sptr = ({ const unsigned char  *__mptr = (&stu.id); (Student *)( (char *)__mptr - ((size_t) &((Student *)0)->id) );}); 
        printf("sptr=%p\n",sptr); 
        //展開替換 
        sptr = ({ const unsigned char  *__mptr = (&stu.name); (Student *)( (char *)__mptr - ((size_t) &((Student *)0)->name) );}); 
        printf("sptr=%p\n",sptr); 
        //展開替換 
        sptr = ({ const unsigned int *__mptr = (&stu.math); (Student *)( (char *)__mptr - ((size_t) &((Student *)0)->math) );}); 
        printf("sptr=%p\n",sptr); 
        return 0;  
} 

到此這篇關(guān)于Linux內(nèi)核中Container_Of宏的詳細(xì)解釋的文章就介紹到這了,更多相關(guān)Linux內(nèi)核中Container_Of宏內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

標(biāo)簽:朝陽 蕪湖 慶陽 那曲 銅川 泰州 周口 松原

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Linux內(nèi)核宏Container_Of的詳細(xì)解釋》,本文關(guān)鍵詞  Linux,內(nèi)核,宏,Container,的,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Linux內(nèi)核宏Container_Of的詳細(xì)解釋》相關(guān)的同類信息!
  • 本頁收集關(guān)于Linux內(nèi)核宏Container_Of的詳細(xì)解釋的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    国产精品乱码妇女bbbb| 欧美男生操女生| 亚洲国产视频一区| 亚洲天天做日日做天天谢日日欢| 欧美日韩亚洲综合在线| 欧美日韩精品欧美日韩精品| 91成人在线精品| 欧美三级视频在线观看| 99国产精品久久久久久久久久| 精品一区二区免费视频| 国产精品白丝av| 成熟亚洲日本毛茸茸凸凹| 成人一区二区视频| 91亚洲永久精品| 欧美色涩在线第一页| 欧美一区午夜视频在线观看| 26uuu欧美| 亚洲小说欧美激情另类| 蜜桃av一区二区在线观看| 九九国产精品视频| 成人av资源在线观看| 欧美久久久一区| 亚洲国产成人午夜在线一区| 亚洲综合在线视频| 精品午夜久久福利影院| 91亚洲精品久久久蜜桃| 色综合久久久久综合99| 欧美成人精品1314www| 亚洲欧美中日韩| 国产一区二三区好的| 色呦呦国产精品| 7777精品伊人久久久大香线蕉的| 久久久影视传媒| 免费看日韩a级影片| 国产精品一区二区久激情瑜伽| 久久99精品久久久久| 麻豆国产91在线播放| 欧美色中文字幕| 视频一区视频二区中文字幕| 欧美日韩在线一区二区| 亚洲一二三四在线观看| 欧美精品免费视频| 激情综合色播五月| 国产精品免费视频观看| 99精品一区二区三区| 亚洲午夜精品网| 日韩免费视频一区二区| 国产精品一级片在线观看| 国产精品久久久久久福利一牛影视 | 五月婷婷综合激情| 欧洲亚洲精品在线| 午夜亚洲福利老司机| 欧洲精品一区二区| 91官网在线免费观看| 国产欧美在线观看一区| 成人一区二区三区视频| 精品欧美乱码久久久久久1区2区| 一卡二卡三卡日韩欧美| 91黄色小视频| 亚洲在线免费播放| 精品美女一区二区| 亚洲一区视频在线观看视频| 欧美亚洲自拍偷拍| 日本不卡免费在线视频| 日韩欧美国产系列| 欧美日韩一二三区| 另类成人小视频在线| 日韩色在线观看| 国产麻豆精品在线观看| 国产精品成人免费精品自在线观看 | 久久精品水蜜桃av综合天堂| 国产激情视频一区二区在线观看| 久久亚洲影视婷婷| av影院午夜一区| 免费一级片91| 国产精品久久久久婷婷 | 亚洲国产精品激情在线观看| 欧美一区二区三区四区视频| 国产91精品一区二区| 无吗不卡中文字幕| 26uuuu精品一区二区| 在线播放一区二区三区| 精品免费视频.| 色香色香欲天天天影视综合网| 日本不卡视频在线观看| 国产亚洲1区2区3区| 欧美国产丝袜视频| 国产精品亚洲第一| 国产精品久久久久一区二区三区共 | 亚洲国产视频直播| 中文字幕一区二区三区乱码在线| 91精品欧美一区二区三区综合在| 粉嫩绯色av一区二区在线观看| 热久久免费视频| 狠狠色狠狠色合久久伊人| 麻豆成人91精品二区三区| 日韩精品亚洲专区| 天天色图综合网| 久久精品国产精品亚洲红杏| 国产精品视频第一区| 奇米综合一区二区三区精品视频| 日欧美一区二区| 狠狠狠色丁香婷婷综合激情| 麻豆传媒一区二区三区| 蜜臀av性久久久久蜜臀aⅴ四虎 | 91在线国内视频| 91国产精品成人| 精品欧美乱码久久久久久1区2区| 日韩精品一区二区在线| 国产日韩av一区| 日日摸夜夜添夜夜添国产精品 | 国产精品网站在线观看| 国产精品青草综合久久久久99| 国产精品免费视频观看| 久久日韩粉嫩一区二区三区| 日韩精品色哟哟| 国产综合成人久久大片91| 91麻豆精品在线观看| 欧美xxxxxxxxx| 亚洲资源中文字幕| 99精品视频中文字幕| 678五月天丁香亚洲综合网| 久久久天堂av| 国产精品卡一卡二| 国产一区二区三区不卡在线观看| 欧美中文字幕一区二区三区| 国产亚洲成av人在线观看导航| 亚洲成人第一页| 欧美性受xxxx| 自拍偷拍国产亚洲| 高清av一区二区| 欧美视频在线播放| 精品在线你懂的| 精品毛片乱码1区2区3区| 免费在线观看一区| 欧美日韩久久久| 亚洲成人一区二区| 91精品国产高清一区二区三区蜜臀| 亚洲天堂精品视频| 视频在线观看一区| 国产日本欧洲亚洲| 日韩av电影免费观看高清完整版 | 日韩一区二区免费在线观看| 一区在线播放视频| 成人激情黄色小说| 精品欧美一区二区久久| 精品一区二区三区久久久| 欧美高清精品3d| 韩国欧美国产一区| 18成人在线观看| 91精品中文字幕一区二区三区| 在线不卡一区二区| 国产福利一区二区| www国产精品av| 91麻豆精品国产自产在线| 韩国欧美国产1区| 奇米777欧美一区二区| 中文av一区特黄| 欧美亚男人的天堂| 欧美吞精做爰啪啪高潮| 免费成人在线播放| ...xxx性欧美| 久久日一线二线三线suv| 91麻豆精东视频| 中文字幕亚洲视频| 欧美一区二区精美| 亚洲国产精品欧美一二99| 国产日韩欧美在线一区| 精品乱码亚洲一区二区不卡| 51精品视频一区二区三区| 欧洲一区二区av| 欧美在线不卡视频| 在线免费观看成人短视频| 99久久精品免费看国产免费软件| 国产在线一区二区| 亚洲一区精品在线| 国产一区欧美二区| 国产一区二区视频在线播放| 日韩国产在线观看一区| 亚洲人成在线观看一区二区| 国产精品毛片无遮挡高清| 国产日本亚洲高清| 日韩一区二区视频| 中文字幕色av一区二区三区| 精品捆绑美女sm三区| 欧美成人一区二区三区在线观看 | 色久综合一二码| 欧美日韩一级片在线观看| 91精品蜜臀在线一区尤物| 欧美成人午夜电影| 国产亚洲精品中文字幕| 国产香蕉久久精品综合网| 午夜欧美大尺度福利影院在线看| 亚洲午夜久久久久中文字幕久| 石原莉奈在线亚洲二区| 免费观看久久久4p| 久久99精品国产麻豆不卡| 国产在线精品国自产拍免费| 91麻豆蜜桃一区二区三区| 日韩午夜激情电影|