欢迎访问 生活随笔!

生活随笔

当前位置: 首页 >

获取结构体中变量的偏移量

发布时间:2023/11/27 47 豆豆
生活随笔 收集整理的这篇文章主要介绍了 获取结构体中变量的偏移量 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

C/C++获取结构体中变量的偏移量

1.某些特殊需求下,我们需要知道某个变量在其结构体中的偏移位置。

通常的做法就是定义一个宏变量,如下:

#define OFFSET(structure, member) ((int64_t)&((structure*)0)->member) // 64位系统
#define OFFSET(structure, member) ((int32_t)&((structure*)0)->member) // 32位系统

2.使用示例:

#include <stdio.h>
#include <stdint.h>#define OFFSET(structure, member) ((int64_t)&((structure*)0)->member)typedef struct _A {int32_t a;int64_t b;int64_t c;int32_t d;
} A;int main()
{printf("offset b: %ld\n", OFFSET(A, b));printf("size: %ld\n", sizeof(A));return 0;
}

3.执行结果:

offset b: 8
size: 32

这里变量 b 的偏移量是 8 个字节,是因为内存对齐的原因,变量 a 虽然是 int32_t 类型,但是也会占用 8 个字节。如果我们直接使用 sizeof(int32_t) 作为变量 b 的偏移量是很容易出错的(比如没有考虑到内存对齐),而且变量多的时候也是很容易出错的,所以建议使用上例中的方法,既方便也不容易出错。

4. example

define:

std::cout<<"set_start_ ="<<set_start_<<std::endl;
std::cout<<" 111 set_start_ ="<<set_start_<<std::endl;
std::cout<<" 111set_start_ address  ="<<&set_start_<<std::endl;
printf("111 offset b: %ld\n", OFFSET(FrameHandlerBase, set_start_));
printf("111size: %ld\n", sizeof(FrameHandlerBase));
std::cout<"#### addresss"<<&.set_start_<<std::endl;

diaoyong:

std::cout<<"222 set_start_ ="<<set_start_<<std::endl;
std::cout<<"222set_start_ address  ="<<&set_start_<<std::endl;
printf("222 offset b: %ld\n", OFFSET(FrameHandlerBase, set_start_));
printf("2222 size: %ld\n", sizeof(FrameHandlerBase));

5.result

 22222222222222222222222222222222 set_start_ =122222222222222222222222222222222set_start_ address  =0x56455c9a0665
22222222222222222222222222222222 offset b: 581
22222222222222222222222222222222 size: 1168111111111111111111111111111111 set_start_ =0111111111111111set_start_ address  =0x56455c9a068d
111111111111111offset b: 621
111111111111111111111111111111  size: 1216
 22222222222222222222222222222222 set_start_ =122222222222222222222222222222222set_start_ address  =0x55606724b665
22222222222222222222222222222222 offset b: 581
22222222222222222222222222222222 size: 1168111111111111111111111111111111 set_start_ =0111111111111111set_start_ address  =0x55606724b68d
111111111111111offset b: 621
111111111111111111111111111111  size: 1216

总结

以上是生活随笔为你收集整理的获取结构体中变量的偏移量的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。