我想在编译时找到struct成员的字节偏移量。例如:
struct vertex_t
{
vec3_t position;
vec3_t normal;
vec2_t texcoord;
}
我想知道normal
的字节偏移量(在这种情况下它应该是12
。)
我知道我可以使用offsetof
,但这是一个运行时功能,我宁愿不使用它。
我正在努力实现的目标是什么?
编辑:offsetof
是编译时,我的不好!
答案 0 :(得分:8)
offsetof
是编译时常量,如果我们查看草案C ++标准部分C.3
C标准库段 2 说:< / p>
C ++标准库提供了来自C库的57个标准宏,如表149所示。
,表格包含offsetof
。如果我们转到C99草案标准部分7.17
通用定义段 3 包括:
offsetof(type,member-designator)
扩展为一个整数常量表达式,其类型为size_t,值为 这是以字节为单位的偏移量[...]
答案 1 :(得分:2)
在C:
offsetof
通常实际上是一个宏,由于它的定义,它可能会被编译器优化,以便它减少到一个常量值。即使它确实成为表达式,它也足够小,几乎不会产生任何开销。
例如,在文件stddef.h
处,它被定义为:
#define offsetof(st, m) ((size_t)(&((st *)0)->m))
在C ++中:
事情变得有点复杂,因为它必须解决成员作为方法和其他变量的偏移。所以offsetof
被定义为调用另一个方法的宏:
#define offsetof(st, m) __builtin_offsetof(st, m)
如果只需要结构,那么offsetof
就足够了。否则,我认为不可能。
答案 2 :(得分:1)
你确定它是运行时吗?
以下作品..
#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;
}