当前位置: 首页 > wzjs >正文

重庆做网站嘉兴公司安徽省建设信息网站

重庆做网站嘉兴公司,安徽省建设信息网站,免费的网站平台有哪些,建设银行山西招聘网站目录 1.通过构造结构体对象计算 2.offsetof宏获取 2.1.介绍 2.2.原理 2.3.注意事项 1.通过构造结构体对象计算 通过创建结构体对象,获取结构体起始地址以及结构体成员的地址,然后将成员地址减去结构体起始地址,就可以得到该成员相对于结…

目录

1.通过构造结构体对象计算

2.offsetof宏获取

2.1.介绍

2.2.原理

2.3.注意事项


1.通过构造结构体对象计算

        通过创建结构体对象,获取结构体起始地址以及结构体成员的地址,然后将成员地址减去结构体起始地址,就可以得到该成员相对于结构体起始位置的偏移量。

#include <iostream>// 定义一个结构体
struct MyStruct {char first;int second;double third;
};int main() {// 创建一个结构体对象MyStruct obj;// 获取结构体起始地址char* structStart = reinterpret_cast<char*>(&obj);// 获取各成员的地址char* firstAddr = reinterpret_cast<char*>(&obj.first);char* secondAddr = reinterpret_cast<char*>(&obj.second);char* thirdAddr = reinterpret_cast<char*>(&obj.third);// 计算偏移量size_t offsetFirst = firstAddr - structStart;size_t offsetSecond = secondAddr - structStart;size_t offsetThird = thirdAddr - structStart;// 输出偏移量std::cout << "Offset of 'first': " << offsetFirst << " bytes" << std::endl;std::cout << "Offset of 'second': " << offsetSecond << " bytes" << std::endl;std::cout << "Offset of 'third': " << offsetThird << " bytes" << std::endl;return 0;
}

方法步骤: 

1)结构体定义:定义了一个名为 MyStruct 的结构体,包含 char 类型的 first、int 类型的 second 和 double 类型的 third 三个成员。
2)创建结构体对象:在 main 函数中创建了一个 MyStruct 类型的对象 obj。
3)获取地址:
使用 reinterpret_cast 将结构体对象的地址转换为 char* 类型,得到结构体的起始地址 structStart。
同样使用 reinterpret_cast 获取各成员的地址,并将其转换为 char* 类型。
4)计算偏移量:通过成员地址减去结构体起始地址,得到各成员的偏移量。
5)输出结果:将计算得到的偏移量输出到控制台。

2.offsetof宏获取

2.1.介绍

        在 C++ 中,你可以使用标准库中的 offsetof 宏来获取结构体中某个成员变量相对于结构体起始地址的偏移量。offsetof 宏定义在 <cstddef> 头文件中,它接受两个参数:结构体类型和结构体成员的名称,返回该成员相对于结构体起始位置的字节偏移量。

        示例代码:

#include <iostream>
#include <cstddef>// 定义一个结构体
struct ExampleStruct {char a;int b;double c;
};int main() {// 获取结构体成员的偏移量std::cout << "Offset of 'a' in ExampleStruct: " << offsetof(ExampleStruct, a) << " bytes" << std::endl;std::cout << "Offset of 'b' in ExampleStruct: " << offsetof(ExampleStruct, b) << " bytes" << std::endl;std::cout << "Offset of 'c' in ExampleStruct: " << offsetof(ExampleStruct, c) << " bytes" << std::endl;return 0;
}

方法步骤: 

1)结构体定义:定义了一个名为 ExampleStruct 的结构体,包含三个成员变量:char 类型的 a、int 类型的 b 和 double 类型的 c。
2)offsetof 宏的使用:在 main 函数中,使用 offsetof 宏分别计算 ExampleStruct 结构体中成员变量 a、b 和 c 相对于结构体起始地址的偏移量,并将结果输出到控制台。
3)输出结果:程序将输出每个成员变量的偏移量(以字节为单位)。

2.2.原理

vs2019的源码实现如下:

#if defined _MSC_VER && !defined _CRT_USE_BUILTIN_OFFSETOF#ifdef __cplusplus#define offsetof(s,m) ((::size_t)&reinterpret_cast<char const volatile&>((((s*)0)->m)))#else#define offsetof(s,m) ((size_t)&(((s*)0)->m))#endif
#else#define offsetof(s,m) __builtin_offsetof(s,m)
#endif
  • s:表示结构体或标准布局类的类型名。
  • m:表示结构体或标准布局类中成员的名称。

实现分析:

1)((s*)0)
把整数 0 强制转换为指向类型 s 的指针。这意味着创建了一个指向地址 0 处的 s 类型对象的指针。这里只是在语法层面模拟,并不会真正访问地址 0 处的内存。
2)((s*)0)->m
通过前面得到的指针来访问 s 类型对象的成员 m。同样,这只是一种语法操作,没有实际的内存访问。
3)reinterpret_cast<char const volatile&>((((s*)0)->m))
reinterpret_cast 是 C++ 中的一种强制类型转换运算符,这里将成员 m 转换为 char const volatile& 类型的引用。
char 类型的大小是 1 字节,将成员转换为 char 类型的引用有助于后续计算偏移量。
const 表示该引用指向的对象是常量,不能被修改。
volatile 关键字告诉编译器该对象的值可能会以编译器无法预知的方式被改变,防止编译器进行过度的优化。
4)&reinterpret_cast<char const volatile&>((((s*)0)->m))
对转换后的引用取地址。由于前面的指针是从地址 0 开始的,所以得到的地址值实际上就是成员 m 相对于结构体起始位置的偏移量。
5)(::size_t)
使用 ::size_t 进行强制类型转换。:: 是作用域解析运算符,这里使用全局作用域的 size_t 类型。size_t 是一种无符号整数类型,通常用于表示对象的大小或内存地址的偏移量,这样能确保偏移量以合适的整数类型表示。

2.3.注意事项

  • 标准布局要求:这个宏只能用于标准布局的结构体和类。如果是非标准布局的类型(如包含虚函数的类),由于内存布局的复杂性,该宏可能无法正确计算偏移量。
  • 可移植性:虽然这种实现方式在大多数编译器和平台上都能正常工作,但在一些特殊的嵌入式系统或编译器中,可能会因为地址 0 有特殊用途而导致问题。不过,标准库提供的 offsetof 是经过严格测试和优化的,具有更好的可移植性。
  • const 和 volatile 的使用:在这个宏中使用 const 和 volatile 主要是为了确保类型转换的正确性和防止编译器过度优化,但在实际计算偏移量时,通常不会影响最终结果。

总的来说,这种自定义 offsetof 宏的实现方式利用了指针运算和地址计算的特性,巧妙地计算出结构体成员的偏移量。


文章转载自:

http://JexAg1A1.cLyhq.cn
http://Gy1w8q5X.cLyhq.cn
http://QCcVhXdP.cLyhq.cn
http://GKCNNbBc.cLyhq.cn
http://fy8p1lHt.cLyhq.cn
http://iei2wUOz.cLyhq.cn
http://odV7rj4e.cLyhq.cn
http://zgKGx7tK.cLyhq.cn
http://73zNtnM9.cLyhq.cn
http://OTSaki7r.cLyhq.cn
http://hSn3rhtL.cLyhq.cn
http://GLnfsV9Z.cLyhq.cn
http://Xx5J9Jwq.cLyhq.cn
http://babtYKTM.cLyhq.cn
http://G9WUUi76.cLyhq.cn
http://iAH0NVIN.cLyhq.cn
http://LbTC1PI3.cLyhq.cn
http://1QAECEbv.cLyhq.cn
http://VgawQUzS.cLyhq.cn
http://wI35MhWG.cLyhq.cn
http://tKFrRKcg.cLyhq.cn
http://JFzjTy8y.cLyhq.cn
http://CJ9zmRel.cLyhq.cn
http://wCkTrm54.cLyhq.cn
http://y1vht5h1.cLyhq.cn
http://4f5HfkmZ.cLyhq.cn
http://9Kpdx1i1.cLyhq.cn
http://y6D3zQyN.cLyhq.cn
http://A87Jx9xC.cLyhq.cn
http://d4hxdUFt.cLyhq.cn
http://www.dtcms.com/wzjs/751951.html

相关文章:

  • 怎么创建一个视频网站淄博网站设计方案
  • 江门营销型网站建设公司十大软件app排行榜下载
  • 企业做网站要注意哪些查域名138
  • 做模型常说的d站是什么网站做网站应该注意什么
  • 桐乡微网站建设公司昆明做网站公司哪家好
  • 网站开发项目实例汇总学校资源网站建设有啥作用
  • 网站制作培训学校个人开发app可以上架吗
  • 湖南城乡建设厅官方网站取消wordpress激活邮件
  • 汉中城乡建设网站搜索网站仿站
  • 网站建设站长网页基础设计
  • 安徽省干部建设教育网站flash做网站
  • 百度网站推广公司怎样用xampp做网站
  • 网站建设的提成深圳搜索引擎优化推广
  • 兼职网站排行网站推广方法是什么
  • 建立个人网站的步骤有哪些做一个网站要多少钱
  • asp.net制作网站开发wordpress主题更换logo
  • 现在网站建设还用测浏览器吗西安网站制作公司怎么选
  • 网站开发制作合同范本国内气膜馆建造商
  • 免费免费建站国网公司网站
  • 绵阳哪个网站做外卖做的好免费网站正能量软件
  • 网站 dns 解析 手机访问设置域名查询万网
  • 个人响应式网站江苏省水建公司官网
  • 网站内容维护更新方法竹溪县县建设局网站
  • 义乌外贸公司建站seo网站关键词优化快速官网
  • 衡阳网站建设公司哪家好小县城做婚礼网站
  • 无锡网站关键词优化软件咨询wordpress 微信采集器
  • 李沧区城市建设管理局网站wordpress灯笼效果
  • 盘锦威旺做网站管理信息系统平台
  • 长沙产品网站建设阜新市项目建设网站
  • c语言和c 哪个做网站好沈阳做网站 熊掌号