其实是存在这样一个宏,专门提供求某个结构体中的成员相对于这个结构体的偏移量的:
offsetof (type,member)
返回值:返回成员偏移量,类型为size_t
功能:具有函数形式的此宏返回数据结构或联合类型类型中成员成员的偏移值(以字节为单位)。 返回的值是size_t类型的无符号整数值,以及指定成员与其结构开头之间的字节数。
使用方法:
/* offsetof example */
#include <stdio.h> /* printf */
#include <stddef.h> /* offsetof */
struct foo {
char a;
char b[10];
char c;
};
int main ()
{
printf ("offsetof(struct foo,a) is %d\n",(int)offsetof(struct foo,a));
printf ("offsetof(struct foo,b) is %d\n",(int)offsetof(struct foo,b));
printf ("offsetof(struct foo,c) is %d\n",(int)offsetof(struct foo,c));
return 0;
}
以上是库中提供的方法,我们也可以手动实例化这个宏:
#define OFFSETOF(type, member) ((int64_t)&((type*)0)->member)//64位主机
#define OFFSETOF(type, member) ((int32_t)&((type*)0)->member)//32位主机
使用如下:
1 #include <iostream>
2 #include <stdint.h>
3
4 using namespace std;
5
6 #define OFFSET1(type, member) ((int64_t)&((type*)0)->member)
7
8 typedef struct A{
9 int a;
10 char b;
11 short c;
12 }A;
13
14 int main(){
15
16 /*int a = 10;
17 int *p = &a;
18 cout << sizeof(p) <<endl;*/
19
20 cout << OFFSET1(A, a) <<endl;
21 cout << OFFSET1(A, b) <<endl;
22 cout << OFFSET1(A, c) <<endl;
23 cout << sizeof(A) <<endl;
24 return 0;
25 }
参考文章:http://www.cplusplus.com/reference/cstddef/offsetof/?kw=offsetof