获取结构体中变量的偏移量
生活随笔
收集整理的這篇文章主要介紹了
获取结构体中变量的偏移量
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
C/C++獲取結(jié)構(gòu)體中變量的偏移量
1.某些特殊需求下,我們需要知道某個(gè)變量在其結(jié)構(gòu)體中的偏移位置。
通常的做法就是定義一個(gè)宏變量,如下:
#define OFFSET(structure, member) ((int64_t)&((structure*)0)->member) // 64位系統(tǒng)
#define OFFSET(structure, member) ((int32_t)&((structure*)0)->member) // 32位系統(tǒng)
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.執(zhí)行結(jié)果:
offset b: 8
size: 32
這里變量 b 的偏移量是 8 個(gè)字節(jié),是因?yàn)閮?nèi)存對(duì)齊的原因,變量 a 雖然是 int32_t 類型,但是也會(huì)占用 8 個(gè)字節(jié)。如果我們直接使用 sizeof(int32_t) 作為變量 b 的偏移量是很容易出錯(cuò)的(比如沒有考慮到內(nèi)存對(duì)齊),而且變量多的時(shí)候也是很容易出錯(cuò)的,所以建議使用上例中的方法,既方便也不容易出錯(cuò)。
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
總結(jié)
以上是生活随笔為你收集整理的获取结构体中变量的偏移量的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【error】error: field
- 下一篇: 岩棉板价格报价 岩棉多少钱一平方