11

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

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

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

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

我正在努力实现的目标是可能的吗?

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

4

3 回答 3

9

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

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

该表包括offsetof. 如果我们去 C99 草案标准部分7.17 通用定义3段包括:

offsetof(type, member-designator)

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

于 2013-11-13T01:19:13.147 回答
2

你确定它是运行时的吗?

以下作品..

#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

于 2013-11-13T01:04:12.210 回答
1

在 C 中:

offsetof通常实际上是一个宏,并且由于它的定义,它可能会被编译器优化,以便它减少到一个常量值。即使它确实变成了一个表达式,它也足够小,几乎不会造成任何开销。

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

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

在 C++ 中:

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

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

如果您只需要它用于结构,那么您对offsetof​​. 否则,我认为这是不可能的。

于 2013-11-13T01:06:04.597 回答