关于偏移量的理解

偏移量是个很神奇的东西,好多学科,好多方面都包含有他的知识。今天主要是想和大家分享一下自己关于偏移量的理解,以新手向为主的理解,那么当然是言简意赅,然后作为抛砖引玉之用吧,希望能有各路大神来补充说明。


产生灵感的来源主要来自于哪里呢?今天接触了一些关于双向循环链表的东西,用老师的话讲叫做“火车皮拉货”,在lxr上面的定义有些绕口,但是画图以后就能清楚的看到,以前接触的链表,形象比喻叫做“把车皮和货物绑在一起”,

关于偏移量的理解_第1张图片


而现在叫做“火车拉货”,

关于偏移量的理解_第2张图片怎么取都可以哦!


再加上他的灵活性,一个节点可以同时存在于两个连表中,很好玩啊!这样的话不是什么东西都可以连接在一起了吗?


那么接下来就讲到偏移量了。熟悉基础和计算机的大神们当然知道偏移量的原理和作用,下午的时候我就是纠结于“偏移量是干什么的”这个问题。


那么首先简单说说偏移量这个东西。就拿container_of这个家伙来说说吧。

#define container_of(ptr, type, member) ({             /
         const typeof( ((type *)0)->member ) *__mptr = (ptr);     /
         (type *)( (char *)__mptr - offsetof(type,member) );})

typeof是取当前变量的类型,那么看那个括号里,是强制转化为了指针,然后由ptr将mptr初始化。ptr呢就作为一个结构体中的指针定义并初始化了。

既然是指针那么我们便可以取到他的地址,而下面的offsetof便是偏移量了。用指针的地址减去偏移量即是结构体开头所在。

关于偏移量的理解_第3张图片



为什么要找到结构体的开头呢?

举个例子:假设你要去火车上的某个位置找一个人,而那个人具体在哪里你并不知道,只能通过查看火车头上提供的座位信息才能确认的话,那么你的首要任务就是先找到火车头,确认你要找的火车车厢,然后才能找到你想要找的人。放在结构体里面来看的话,你就好比是那个ptr,那个已知知位置的指针,而你从现在所在位置到达火车头所走过的距离就是偏移量。


有人可能会问,为什么我要走这个偏移量呢?开始的时候我也不明白,朋友告诉我是因为读取数据的规定要求这样做。但是后来我想通了。

原因其实也很简单,作为计算机,他所能识别的语言只有“0”、"1",而它存放的数据也是连续的,这和他的构造也有一定的关系。如果我们把一个结构体看作是一个装满数据的小盒子的话,即便是我们知道要找的信息在盒子里,我们也只能是通过从头到尾遍历查找的方式确认信息到底在什么地方。而因为我们开始并不知道ptr指针在数据盒子所处的相对位置,因此我们需要确定他的具体位置所在。亦或是我们知道了要找的数据大致在什么位置,也得首先确定数据头的位置,才能够确定出信息具体的位置所在。

这个用火车的例子也能够说明白。我们可能知道要找的人大致在哪个车厢,但是我们现在所在的位置并不是确定的,因此为了确保位置的准确性,我们需要找到火车头,但后在一节节车厢或者是确定到某个车厢来找到我们需要找到的人。




罗嗦了这么多,不知道大家有没有看懂呢?我是一个喜欢把抽象的东西具体化的人,本身这些理论就比较抽象,更何况“不懂得生活的人就不懂得代码”,希望我的生涩的凌乱的语句能够帮助大家从一定角度理解偏移量这个可爱的家伙。

你可能感兴趣的:(关于偏移量的理解)