gpt4 book ai didi

c - 为什么需要 offsetof 宏?

转载 作者:太空狗 更新时间:2023-10-29 17:12:17 29 4
gpt4 key购买 nike

我是 C 语言的新手,刚学过结构体和指针。

我的问题与 offsetof 有关我最近看到的宏。我知道它是如何工作的以及背后的逻辑。

<stddef.h>文件定义如下:

#define offsetof(type,member) ((unsigned long) &(((type*)0)->member))

我的问题是,如果我有一个如下所示的结构:

struct test {
int field1:
int field2:
};

struct test var;

为什么不能直接获取field2的地址作为:

char * p = (char *)&var;
char *addressofField2 = p + sizeof(int);

与其写这样的东西

field2Offset = offsetof (struct test, field2);

然后在var的起始地址加上偏移值?

有区别吗?正在使用 offsetof更高效?

最佳答案

C 编译器通常会在 struct 的成员之间添加额外的填充位或字节,以提高效率并保持整数字对齐(在某些体系结构中需要避免 bus errors 和在某些架构中需要避免效率问题)。例如,在许多编译器中,如果你有这个 struct:

struct ImLikelyPadded {
int x;
char y;
int z;
};

您可能会发现 sizeof(struct ImLikelyPadded) 是 12,而不是 9,因为编译器会在一字节 char y 的末尾插入三个额外的填充字节> 和字大小的 int z。这就是 offsetof 如此有用的原因 - 它可以让您确定事物的真正位置,甚至考虑填充字节并且具有高度可移植性。

关于c - 为什么需要 offsetof 宏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35259189/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com