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)
非常神奇的一个函数。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人