天天看点

【C++】求某成员相对于结构体起始位置的偏移量?

文章目录

    • 👩‍🏫每日一问,好好复习
    • offsetof
      • 🔒1.1什么是offsetof?
      • 🔒1.2如何声明?
      • 🔒1.3实例
      • 🔒1.4图示
    • offsetof如何实现
      • 🔒2.1offsetof原理
      • 2.2实现offsetof

👩‍🏫每日一问,好好复习

❤结构体大小怎么计算?内存对齐?偏移量?

在结构体大小计算中,我们提到了内存对齐的问题,并且“人工”的计算了偏移量,那有什么方法可以“解放双手”嘛~

offsetof

🔒1.1什么是offsetof?

C 语言库中提供了一个宏函数 offsetof(type, member-designator)

它会生成一个类型为 size_t 的整型常量,是一个结构成员相对于结构开头的字节偏移量

成员是由 member-designator 给定的,结构的名称是在 type 中给定的。

【C++】求某成员相对于结构体起始位置的偏移量?

🔒1.2如何声明?

offsetof(type, member-designator)

参数

type

这是一个 class 类型,其中,member-designator 是一个有效的成员指示器。

member-designator

这是一个 class 类型的成员指示器。
返回值
该宏返回类型为

size_t

的值,表示 type 中成员的偏移量。

🔒1.3实例

下面的实例演示了 offsetof() 宏的用法。
#include <stddef.h>//必带头文件
#include <stdio.h>

struct address {
   char name[5];
   char street[10];
   int phone;
};
   
int main()
{
   printf("address 结构中的 name 偏移 = %d 字节。\n",
   offsetof(struct address, name));
   
   printf("address 结构中的 street 偏移 = %d 字节。\n",
   offsetof(struct address, street));
   
   printf("address 结构中的 phone 偏移 = %d 字节。\n",
   offsetof(struct address, phone));

   return(0);
} 

           

🔒1.4图示

【C++】求某成员相对于结构体起始位置的偏移量?

offsetof如何实现

🔒2.1offsetof原理

1.上述的图解我们可以发现

偏移量 = (成员的起始存放地址-起始地址)= 成员地址

2.那我们假设结构体的起始地址是0,那成员的偏移量就是成员的地址

3.思路来了

3.1我们只需要把0强转成结构体指针类型

3.2用这个指针去访问结构体的成员

3.4取出这个成员的地址,因为现在的结构体起始位置的地址是0,所以得到的值就是这个成员的偏移量

3.5最后强转成

size_t

类型,就得到结果了

2.2实现offsetof

#include <stddef.h>//必带头文件
#include <stdio.h>
#define OFFSETOF(struct_type,mem_name)  \
		   (size_t)(&((struct_type*)0)->mem_name)
struct address {
   char name[5];
   char street[10];
   int phone;
};
   
int main()
{
	printf("%u\n", OFFSETOF(struct address, name));//0
	printf("%u\n", OFFSETOF(struct address, street));//5
	printf("%u\n", OFFSETOF(struct address, phone));//16

  
   offsetof(struct address, name));//0
   offsetof(struct address, street));//5
   offsetof(struct address, phone));//16

   return(0);
}