在编译时确定struct成员字节偏移量?

时间:2013-11-13 00:55:56

标签: c++ struct offset compile-time offsetof

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

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

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

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

我正在努力实现的目标是什么?

编辑offsetof是编译时,我的不好!

3 个答案:

答案 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;
}

另见:offsetof at compile time