__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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • yum 安装卸载mysql_yum 安装卸载mysql

    yum 安装卸载mysql_yum 安装卸载mysqllinux下使用yum安装mysql1、安装查看有没有安装过:yumlistinstalledmysql*rpm-qa|grepmysql*查看有没有安装包:yumlistmysql*安装mysql客户端:yuminstallmysql安装mysql服务器端:yuminstallmysql-serveryuminstallmysql-develwww.2cto.co…

    2022年5月20日
    34
  • 还在找 WiFi 吗?

    还在找 WiFi 吗?

    2021年6月8日
    83
  • JavaScript详细解析

    JavaScript详细解析文章目录1、JavaScript详细解析1.1、JavaScript介绍1.2、快速入门引入js的方式一:内部方式引入js的方式一:外部方式1.3、开发环境搭建1.4、快速入门总结2、JavaScript基本语法2.1、注释2.2、输入输出语句2.3、变量和常量2.4、原始数据类型和typeof方法2.4.1、原始数据类型2.4.2、typeof2.5、运算符2.6、流程控制和循环语句2.7、数组2.8、函数2.9、小结3、JavaScriptDOM3.1、DOM介绍3.2、Element元素的获取操作3

    2022年7月17日
    10
  • batch内负采样

    batch内负采样一般在计算softmax交叉熵时,需要用tf.nn.log_uniform_candidate_sampler多itemid做随机负采样。但是在类似dssm这种双塔模型中,item侧特征除了itemid外,还有其他meta特征,此时负样本对itemid做负采样后,还需要取相应负样本的meta特征。可是在tf训练数据中并不方便建立itemid与各类meta特征的映射表。为了解决dssm类模型的负采样问题,可以取一个batch内其他用户的正样本做为本用户的负样本,以解决负采样meta特征问题。好了,废话少说,

    2022年6月23日
    62
  • 天气预报代码调用

    天气预报代码调用

    2021年10月11日
    47
  • 表白代码vbs不同意无法关闭(vbs表白代码不同意按键会跑)

    代码网上很多,我找了两个,再加上一些套路,效果更好。代码1:msgbox”做我女朋友好吗”,vbQuestion,”在吗”msgbox(“房产写你名字”)msgbox(“保大”)msgbox(“我妈会游泳”)dimjdowhilej<1SelectCasemsgbox(“做我女朋友好吗”,68,”请郑重的回答我”)Case6j=1Case7msgbox(“再给你一次机会”)endSelectloopmsgbox(“我就知道你会同意的,哈哈哈哈

    2022年4月17日
    65

发表回复

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

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