为什么 gcc 会发出有关有条件支持的 offsetof 的警告?
Why does gcc throw warning about conditionally-supported offsetof?
我在 c++ 中有两个结构
struct Vertex {
float x,y,z;
float nx, ny, nz;
};
struct SkinnedVertex : public Vertex {
uint32_t j0, j1, j2, j3;
float w0, w1, w2, w3;
}
现在,当我使用 offsetof
获取 Vertex
的偏移量时,一切都很好,但是如果我在 SkinnedVertex
中使用 offsetof
,我会收到以下警告使用 GCC 编译:
warning: offsetof within non-standard-layout type ‘SkinnedVertex’ is conditionally-supported
我猜这是因为我从 Vertex
继承了 SkinnedVertex
,这使它成为非标准布局。但是为什么会这样呢?继承是否会添加额外的信息使其成为非标准布局?你有没有办法强制执行它,使这两个结构都采用标准布局?
编辑:将 jN 类型更改为 uint32_t(为浮点数)
https://en.cppreference.com/w/cpp/named_req/StandardLayoutType
标准布局类型要求所有数据成员都属于同一类型。
标准布局在定义上是保守的。可以将其他类型制作为标准布局。一个类型不是标准布局的事实并不意味着它有充分的理由不是。这只是意味着标准委员会和编译器还没有完成工作来证明它的合理性。我的意思是,如果委员会真的想要(比如,标准化 vtables 的工作方式),你可以用虚函数标准布局制作 classes。
一个问题是委员会不想不必要地破坏现有代码。因此,除非有充分的理由,否则他们会尝试标准化现有的做法。如果两个编译器在 class 的布局上存在分歧,那么标准化它们的布局成本更高 and/or 产生的收益更少。
标准布局在技术上只是一个标志;从语义上讲,这意味着具有相似选项(如打包)的不同编译器将编译兼容的数据布局。
我在 c++ 中有两个结构
struct Vertex {
float x,y,z;
float nx, ny, nz;
};
struct SkinnedVertex : public Vertex {
uint32_t j0, j1, j2, j3;
float w0, w1, w2, w3;
}
现在,当我使用 offsetof
获取 Vertex
的偏移量时,一切都很好,但是如果我在 SkinnedVertex
中使用 offsetof
,我会收到以下警告使用 GCC 编译:
warning: offsetof within non-standard-layout type ‘SkinnedVertex’ is conditionally-supported
我猜这是因为我从 Vertex
继承了 SkinnedVertex
,这使它成为非标准布局。但是为什么会这样呢?继承是否会添加额外的信息使其成为非标准布局?你有没有办法强制执行它,使这两个结构都采用标准布局?
编辑:将 jN 类型更改为 uint32_t(为浮点数)
https://en.cppreference.com/w/cpp/named_req/StandardLayoutType
标准布局类型要求所有数据成员都属于同一类型。
标准布局在定义上是保守的。可以将其他类型制作为标准布局。一个类型不是标准布局的事实并不意味着它有充分的理由不是。这只是意味着标准委员会和编译器还没有完成工作来证明它的合理性。我的意思是,如果委员会真的想要(比如,标准化 vtables 的工作方式),你可以用虚函数标准布局制作 classes。
一个问题是委员会不想不必要地破坏现有代码。因此,除非有充分的理由,否则他们会尝试标准化现有的做法。如果两个编译器在 class 的布局上存在分歧,那么标准化它们的布局成本更高 and/or 产生的收益更少。
标准布局在技术上只是一个标志;从语义上讲,这意味着具有相似选项(如打包)的不同编译器将编译兼容的数据布局。