我正在使用开源库(Easy C 状态机)。当我查看代码时,我发现该结构是通过基地址 + X 的偏移量访问的,如下所示。
#define OFF_SET_OF_XX 1
#define GET_MEMBER(X, Y, Z) ((X)(*((X*)(((int*)(Y))+Z))))
typedef struct Foo {
int i;
int XX;
}Foo;
Foo *foo1 = alloc(...);
int j = GET_MEMBER(int, foo1, OFF_SET_OF_XX);
代替:
Foo *foo1 = alloc(...);
int j = foo1->XX;
以上两者有什么区别?前者有什么优势吗?
这个库是用ANSI C写的。但是据说它只能支持两种架构: x86 和 amd64。因为我想在另一个架构上使用它,所以我查看了源代码,发现唯一与架构相关的代码是 OFF_SET_OF_XXs。
最佳答案
首先,我想指出最左边的类型转换为 X
不是必需的,因此您可以将其简化为:
#define GET_MEMBER(X, Y, Z) (*((X*)(((int*)(Y))+Z)))
仍然,我不明白使用这样的宏的目的。它抛弃了类型安全并且语法很麻烦。
编译器为这两种不同方式生成的代码即使不完全相同,也应该非常相似。但是这个库应该在什么编译器和平台上编译呢?如果碰巧在该编译器中使用 GET_MEMBER
可以提高性能,那么这可能就是他们使用它的原因。
编辑 1: 我的猜测是该库的原作者不知道结构,并使用 alloc、指针和宏发明了他自己的类似于结构的东西。现在他已经将库开源,其他人正在尝试将其转换为使用结构,但是有很多代码要转换,他们还没有完成。
关于c - 通过基地址+ XX 的偏移量访问结构成员 XX 和 struct_name->XX 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6441922/