天天看點

【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);
}