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)

非常神奇的一个函数。

posted @ 2022-02-26 19:04  计算机知识杂谈  阅读(379)  评论(0编辑  收藏  举报