日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

container_of深入理解

發布時間:2023/12/10 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 container_of深入理解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

container_of在linux頭文件kernel.h中定義,如下:

14#ifndef offsetof15#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)16#endif1718#ifndef container_of19/**20 * container_of - cast a member of a structure out to the containing structure21 * @ptr: the pointer to the member.22 * @type: the type of the container struct this is embedded in.23 * @member: the name of the member within the struct.24 *25 */26#define container_of(ptr, type, member) ({ /27 const typeof(((type *)0)->member) * __mptr = (ptr); /28 (type *)((char *)__mptr - offsetof(type, member)); })29#endif 這里在簡單插入對typeof的理解: typeof關鍵字是C語言中的一個新擴展。從語義上看,typeof 關鍵字將用做類型名(typedef名稱)并指定類型。 請注意,typeof構造中的類型名不能包含存儲類說明符,如extern或static。不過允許包含類型限定符,如const或volatile。 例如:

? 1. struct demo_struct {
?? 2.???? type1 member1;
?? 3.???? type2 member2;
?? 4.???? type3 member3;
?? 5.???? type4 member4;
?? 6. };
?? 7.
?? 8. struct demo_struct demo;

?? struct demo_struct *demop = container_of(memp, struct demo_struct, member3);
首先,我們將container_of(memp, struct demo_struct, type3)根據宏的定義進行展開如下:
?? 1. struct demo_struct *demop = ({????????????????????? /
?? 2.???? const typeof( ((struct demo_struct *)0)->member3 ) *__mptr = (memp);??? /
?? 3.???? (struct demo_struct *)( (char *)__mptr - offsetof(struct demo_struct, member3) );})

假設結構體變量demo在實際內存中的位置如下圖所示:
???? demo
+-------------+ 0xA000
|?? member1????????????? |
+-------------+ 0xA004
|?? member2???????????? |
|??????????????????????????????? |
+-------------+ 0xA010
|?? member3???????????? |
|??????????????????????????????? |
+-------------+ 0xA018
|?? member4???????????? |
+-------------+
則,在執行了上述代碼的第2行之后__mptr的值即為0xA010。

同樣,我們將上述的offsetof調用展開,即為:
?? 3. (struct demo_struct *)( (char *)__mptr - ((size_t) &((struct demo_struct *)0)->member3) );
可見,offsetof的實現原理就是取結構體中的域成員相對于地址0的偏移地址,也就是域成員變量相對于結構體變量首地址的偏移。
因此,offsetof(struct demo_struct, member3)調用返回的值就是member3相對于demo變量的偏移。結合上述給出的變量地址分布圖可知,offsetof(struct demo_struct, member3)將返回0x10。
于是,由上述分析可知,此時,__mptr==0xA010,offsetof(struct demo_struct, member3)==0x10。
因此, (char *)__mptr - ((size_t) &((struct demo_struct *)0)->member3) == 0xA010 - 0x10 == 0xA000,也就是結構體變量demo的首地址(如上圖所示)。

轉載于:https://www.cnblogs.com/p2liu/archive/2011/05/24/6048784.html

總結

以上是生活随笔為你收集整理的container_of深入理解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 黄色成人av网站 | 国产日产亚洲系列最新 | 黄色com | 免费激情视频网站 | 日韩av影音先锋 | 波多野吉衣一区二区三区 | 黑人玩弄人妻一区二区绿帽子 | 久久伊人精品 | 狠狠操夜夜 | 无码人妻久久一区二区三区蜜桃 | 天天插天天干 | 99热网| 日批黄色片 | 国产成人在线观看 | 国模二区 | 亚洲av鲁丝一区二区三区 | 日本视频一区二区 | 国产91美女视频 | 欧美一级淫片免费视频魅影视频 | 日韩不卡一二三 | 亚洲黄av| 91偷拍一区二区三区精品 | 性色av网 | 欧美伦理在线观看 | 国产露脸150部国语对白 | 男人天堂手机在线 | 日韩免费在线观看视频 | 伊人天天干 | 国产精品日韩一区 | 欧美黄页在线观看 | 国产精品自拍网 | 日韩图片区| 伊人365影院 | 国产xxx69麻豆国语对白 | 亚洲精品视频在线观看免费视频 | 91av短视频| 在线看你懂得 | 第一宅男av导航入口 | 卡通动漫亚洲综合 | 五月激情婷婷网 | 亚洲网站在线免费观看 | 免费a视频 | 国产女人18毛片水真多18 | 播播网色播播 | 精品不卡一区二区三区 | 亚洲精品97| 3d动漫精品啪啪一区二区下载 | 国产精品不卡在线 | 亚洲精品lv | 欧美日韩三 | 九九爱精品视频 | 国产妇女馒头高清泬20p多 | 黄色免费在线播放 | 国产成人午夜 | 久久密桃 | 日本特黄色片 | 亚洲天堂精品一区 | 亚洲一区精品在线观看 | 日韩欧美精品在线播放 | 国产精品成人无码专区 | 野花国产精品入口 | 96国产精品 | 天美乌鸦星空mv | 海量av| 色超碰 | 麻豆changesxxx国产 | a国产精品 | 国产午夜精品一区二区三区 | 中文字幕亚洲成人 | 青青视频网 | 国产又粗又深又猛又爽又在线观看 | 日日骚网| 狠狠躁夜夜躁人人爽天天高潮 | 日本不卡一区二区在线观看 | 亚洲欧美色图 | 一级二级三级黄色片 | 欧美人伦 | 99色在线视频 | 国产拍拍拍拍拍拍拍拍拍拍拍拍拍 | 97国产在线观看 | 成年网站在线观看 | 成人午夜精品福利 | 国产精品老女人 | 久久亚洲AV成人无码一二三 | 久久久精品91 | 免费a大片| 一级片免费观看视频 | 成人一区二区在线观看 | 日本少妇喷水视频 | 日本特黄一级 | 草一色| 免费成人在线观看动漫 | 久久黄色片视频 | 三级亚洲 | 日本精品免费一区二区三区 | 乳色吐息在线看 | 国产日韩一区 | 日韩精品免费在线观看 | 精品日韩一区二区三区四区 |