日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

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

發布時間:2023/11/27 生活经验 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 获取结构体中变量的偏移量 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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

總結

以上是生活随笔為你收集整理的获取结构体中变量的偏移量的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。