__builtin_offsetof()[通俗易懂]

__builtin_offsetof()[通俗易懂]————-linuxcompiler-gcc4.h————–#define__compiler_offsetof(a,b)__builtin_offsetof(a,b)分析准备:__compiler_offsetof(),为gcc编译器中的编译方面的参数,查阅gcc方面的文档:—>gcc.pdf.Downloadfromwww.gn

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

本文转载自  :  https://blog.csdn.net/rockhui/article/details/6304705 

————-linuxcompiler-gcc4.h————–
#define __compiler_offsetof(a,b) __builtin_offsetof(a,b)
分析准备:__compiler_offsetof(),为gcc编译器中的编译方面的参数,查阅gcc方面的文档:
—>gcc.pdf.Download from www.gnu.org 。其中解释如下:
#define offsetof(type, member) __builtin_offsetof (type, member)

自己分析:即:__builtin_offsetof(a,b)就是#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)。__builtin_offsetof(a,b)和offsetof(TYPE,MEMBER)本质一样的,只是 offsetof()宏是由程序员自己来设计(详见后面讲解)。而__builtin_offsetof()宏就是在编译器中已经设计好了的函数,直接调用即可。明白了这个区别后,下面的代码很好理解。

——-linuxstddef.h—–offsetof()———–
#define __compiler_offsetof(a,b) __builtin_offsetof(a,b)
——————————-
#undef offsetof
#ifdef __compiler_offsetof
#define offsetof(TYPE,MEMBER) __compiler_offsetof(TYPE,MEMBER)
#else
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
#endif
1.对__compiler_offsetof()宏的分析:
__compiler_offsetof来确认编译器中是否内建了功能同offsetof()宏一样的宏。若已经内建了这样的宏,则 offsetof()就是使用这个内建宏__compiler_offsetof()即:__builtin_offsetof()宏。如果没有定义 __compiler_offsetof()宏,则offsetof()宏就由程序员来设计之。

2.对offsetof()宏的分析:(以下引用论坛)—曾经的腾讯QQ的笔试题。
宿舍舍友参加qq笔试,回来讨论一道选择题,求结构中成员偏移。
想起Linux内核链表,数据节点携带链表节点,通过链表访问数据的方法,用到offsetof宏,今天把它翻了出来:
#define offsetof(TYPE, MEMBER) ((size_t) & ((TYPE *)0)->MEMBER )

一共4步
1. ( (TYPE *)0 ) 将零转型为TYPE类型指针;
2. ((TYPE *)0)->MEMBER 访问结构中的数据成员;
3. &( ( (TYPE *)0 )->MEMBER )取出数据成员的地址;
4.(size_t)(&(((TYPE*)0)->MEMBER))结果转换类型.巧妙之处在于将0转换成(TYPE*),结构以内存空间首地址0作为起始地址,则成员地址自然为偏移地址;
举例说明:
#include<stdio.h>
typedef struct _test
{

char i;
int j;
char k;
}Test;
int main()
{

Test *p = 0;
printf(“%p “, &(p->k));
}
自己分析:这里使用的是一个利用编译器技术的小技巧,即先求得结构成员变量在结构体中的相对于结构体的首地址的偏移地址,然后根据结构体的首地址为0,从而得出该偏移地址就是该结构体变量在该结构体中的偏移,即:该结构体成员变量距离结构体首的距离。在offsetof()中,这个member成员的地址实际上就是type数据结构中member成员相对于结构变量的偏移量。对于给定一个结构,offsetof(type,member)是一个常量,list_entry()正是利用这个不变的偏移量来求得链表数据项的变量地址。

敬请高手指正。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/172103.html原文链接:https://javaforall.net

(0)
上一篇 2022年8月22日 上午9:46
下一篇 2022年8月22日 上午10:00


相关推荐

  • 推荐系统FM & FFM算法解读与实践

    推荐系统FM & FFM算法解读与实践在推荐系统和计算广告业务中,点击率CTR(click-throughrate)和转化率CVR(conversionrate)是衡量流量转化的两个关键指标。准确的估计CTR、CVR对于提高流量的价值,增加广告及电商收入有重要的指导作用。业界常用的方法有人工特征工程+LR(LogisticRegression)、GBDT(GradientBoostingDecisionTree)+…

    2022年6月11日
    39
  • 公云(3322)动态域名指定ip解析脚本

    公云(3322)动态域名指定ip解析脚本适用于路由器 ddns 插件脚本 http USERNAME PASSWORD members 3322 net dyndns update system dyndns amp hostname DOMAIN amp myip IP 浏览器访问 USERNAME PASSWORD 替换为用户名 密码 不要忘了中间的冒号 DOMAIN 替换为要解析的域名 IP

    2026年3月17日
    1
  • Cholesky分解

    Cholesky分解楚列斯基 Cholesky 分解用于对称矩阵的分解 使用该方法 对称矩阵 A 可以分解为 A U U 其中 U 为上三角矩阵 U 为 U 的转置 实现算法为 nbsp 当然 MATLAB 中是有现成的函数的 不需要我们手动编写 M 文件 该函数就是 chol 例如下面这个矩阵 A nbsp nbsp nbsp 1 nbsp nbsp 2 nbsp nbsp 3 nbsp nbsp nbsp 2 nbsp nbsp 8 nbsp nbsp 8 nbsp nbsp

    2026年3月20日
    2
  • ffmpeg 常用命令汇总

    ffmpeg 常用命令汇总part1 经常用到 ffmpeg 做一些视频数据的处理转换等 用来做测试 今天总结了一下 参考了网上部分朋友的经验 一起在这里汇总了一下 有需要的朋友可以收藏测试一下 有问题欢迎在下面回帖交流 谢谢 byternence hsu 1 ffmpeg 使用语法命令格式 nbsp nbsp ffmpeg i 输入文件名 参数选项 f 格式 输出文件 nbsp nbsp ff

    2026年3月18日
    3
  • MyEclipse10激活成功教程_MyEclipse激活码

    MyEclipse10激活成功教程_MyEclipse激活码myEclipse10可以去很多地方下载,我这里是从电脑管家下载的,下载完成后安装,安装很简单,不在多说安装完成后会发现你只有一个月的试用时间,我们就需要激活成功教程,这里需要下载一个激活成功教程补丁https://pan.baidu.com/s/1ivE2yauZRDdDq8zBxpK06A可以去网盘里下载,下载后解压,会有如下文件然后运行run.bat,会出现这个界面…

    2022年9月30日
    5
  • Java大数据方向:入行Java大数据值得吗

    Java大数据方向:入行Java大数据值得吗Java 语言的精密和强大 使得这门语言在技术开发领域 始终占据着重要的地位 进入大数据时代以来 Java 作为大数据开发的主流编程语言 其实力再次得到认可 很多人也看好 Java 大数据方向 那么现在入行 Java 大数据值得吗 前景如何呢 大数据的趋势 在这几年的发展当中 已经是显而易见了 而要论大数据的潜力 随着 5G 物联网的加入 大数据还远没有达到顶峰 至少未来 10 年内大数据的发展趋势还会继续保持 人工智能的爆发 将会有更多企业会进入大数据领域 Java 大数据方向 也因此成为很多 Java 老鸟看好的方

    2026年3月26日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号