b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

typeof、offsetof、container

电脑杂谈  发布时间:2016-05-30 02:00:08  来源:网络整理

你是否正在寻找关于offsetof的内容?让我把最实用的东西奉献给你:

链表是内核最经典的数据结构之一,说到链表就不得不提及内核最经典(没有之一)的宏container_of。

container_of似乎就是为链表而生的,它的主要作用是根据一个结构体变量中的一个域成员变量的指针来获取指向整个结构体变量的指针,最典型的应用就是根据链表节点获取链表上的元素对象。

container_of的宏定义如下:

这个宏乍一看有点瘆人,宏里面包含了两个关键字:typeof和offsetof

typeof是GNU对C新增的一个扩展关键字,用于获取一个对象的类型,在很多时候我们处理的对象通常是一个指针,而此时如果想知道指针所指向的对象的类型,typeof就派上用场了,详见GNU的官方文档:


现在看container_of宏的第一条语句:

  • type member ptr
  • 创建一个类型为即类型为type结构的member域所对应的对象类型的常指针__mptr,并用ptr初始化之,这样一来,__mptr就指向了某一个type的member域。因为数据结构是顺序存储的,此时如果知道member在type结构中的相对偏移,那么用__mptr减去此偏移便是ptr所属的type的地址,因此宏的第二条语句应运而生:

  • char
  • 另一个主角出场了---offsetof,返回一个数据域在它所属的数据结构中的相对偏移,单位是size_t,宏定义如下:

  • #define offsetofsize_tTYPE MEMBER就是type的member域,现在取址后就是member域的地址,因为type的地址为0,则member的地址实质上就是它相对于type地址的偏移。这里为什么可以这样实现而不会出错呢?有两点原因,其一,地址0是在编译器编译时已经指定好了的,其二,这里全部都是取址操作,并没内存数据访问,因此不会存在非法访问内存的问题。

    这样贯穿起来看,其实container_of的实现其实也是蛮清晰的,记得某位兄台说过一句话:一切事物在你看清楚它的本质之前,对你而言总是朦胧的,。


    阅读(3831) | 评论(2) | 转发(11) |

    2

    上一篇:内核内存池--mempool

    下一篇:Linux 进程热升级

    相关热门文章

    以上就是关于offsetof的全部内容,相信你一定会非常满意。


    本文来自电脑杂谈,转载请注明本文网址:
    http://www.pc-fly.com/a/shenmilingyu/article-6826-1.html

    • 相关阅读
        发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

        热点图片
        拼命载入中...