我想在编译时找到结构成员的字节偏移量。 例如:
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;
}
另请参阅此处:编译时的偏移量