在编译时确定结构成员字节偏移量

Determining struct member byte-offsets at compile-time?

本文关键字:成员 字节 偏移量 结构 编译      更新时间:2023-10-16

我想在编译时找到结构成员的字节偏移量。 例如:

struct vertex_t
{
    vec3_t position;
    vec3_t normal;
    vec2_t texcoord;
}

我想知道normal的字节偏移量是(在这种情况下应该是12

我知道我可以使用offsetof,但这是一个运行时函数,我宁愿不使用它。

我想要完成的事情甚至可能吗?

编辑offsetof是编译时,我的错!

offsetof是一个

编译时常数,如果我们看一下C++标准部分的草案C.3 C标准库2段说:

C++ 标准库提供了 C 库中的 57 个标准宏,如表 149 所示。

该表包括offsetof.如果我们转到C99草案标准部分7.17常见定义3段包括:

偏移量(类型,成员指示符)

它扩展到类型为 size_t 的整数常量表达式,其值为 这是以字节为单位的偏移量 [...]

在 C 中:

offsetof通常实际上是一个宏,并且由于其定义,编译器可能会对其进行优化,使其减少到常量值。即使它确实成为一个表达式,它也足够小,几乎不会产生开销。

例如,在文件stddef.h ,它定义为:

#define offsetof(st, m) ((size_t)(&((st *)0)->m))

在C++:

事情变得有点复杂,因为它必须将成员的偏移量解析为方法和其他变量。因此offsetof被定义为调用另一个方法的宏:

#define offsetof(st, m) __builtin_offsetof(st, m)

如果您只需要结构,那么您就足够了 offsetof .否则,我认为这是不可能的。

你确定它是运行时吗?

以下作品..

#include <iostream>
#include <algorithm>

struct vertex_t
{
    int32_t position;
    int32_t normal;
    int32_t texcoord;
};
const int i = offsetof(vertex_t, normal); //compile time..
int main()
{
    std::cout<<i;
}

另请参阅此处:编译时的偏移量