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