offsetof函数的实现
我们在C语言中,经常使用offsetof函数来看结构体的偏移量。
例如:
#include<iostream>
#include<stdio.h>
struct Test{
char c;
int data;
};
int main(){
printf("%d",offsetof(Test,data));
}
此处,data变量在Test结构体中偏移量为4(在我的环境中,int为4个字节)
那么offsetof是如何实现的呢?我们来研究一下。首先offsetof是个宏,使用define来定义。
即:#define my_offset_of(s,m)
s为结构体名,m为成员名。
此时,这个函数就需要求出:1.m所在的地址 2.结构体s开头地址
把两数相减就能求得结果。
我们是不知道结构体s开头的地址的,因为我们连这个结构体都没有,如果把它设为0呢?由于这个结构体只需要用来计算,不需要访问里面的值,写0也是完全没有问题的。
然后我们只需要求得m的地址,也是非常简单,使用->运算符即可。
最终结果就是:
#define my_offset_of(s,m) &(((s*)0)->m)
非常神奇的一个函数。