c - 通过基地址+ XX 的偏移量访问结构成员 XX 和 struct_name->XX 之间的区别

标签 c

我正在使用开源库(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/

相关文章:

国家分组 c

c - 如何从头开始使用 C 编写 Web 浏览器

c - execvp() 输出为 ncurses 创建缩进

c - 重新索引 Char 中的位

c - 在 ubuntu for arm 上编译 TCC 的问题

c - Keil ARM C 编译器 : troubles with inline functions

c - 函数中的局部变量重叠并破坏共享对象中定义的静态全局变量的内存空间

c - 在 C 中使用#define 定义全局 int 和二维矩阵

c - 线程1收到信号SIGSEGV,段错误

c - 如何在 Github 上托管的存储库上使用 git_branch_create()?