文章目錄
-
- 👩🏫每日一問,好好複習
- 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)
傳回值這是一個 class 類型,其中,member-designator 是一個有效的成員訓示器。
type
這是一個 class 類型的成員訓示器。
member-designator
該宏傳回類型為的值,表示 type 中成員的偏移量。
size_t
🔒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);
}