c++ - 为什么 gcc 会发出有关有条件支持的 offsetof 的警告?

标签 c++ gcc

我在 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 的偏移量,一切都很好,但如果我使用 offsetofSkinnedVertex ,我在使用 GCC 编译时收到以下警告:

warning: offsetof within non-standard-layout type ‘SkinnedVertex’ is conditionally-supported

我的猜测是发生这种情况是因为我继承了 SkinnedVertex来自 Vertex ,这使它成为非标准布局。但是为什么会这样呢?继承是否会添加额外的信息使其成为非标准布局?你有没有办法强制执行它,使这两个结构都采用标准布局?

编辑:将 jN 类型更改为 uint32_t(为浮点型)

最佳答案

https://en.cppreference.com/w/cpp/named_req/StandardLayoutType

标准布局类型要求所有数据成员都属于同一类型。

标准布局在定义上是保守的。可以将其他类型制作为标准布局。一个类型不是标准布局的事实并不意味着它有充分的理由不是。这只是意味着标准委员会和编译器还没有完成工作来证明它的合理性。我的意思是,如果委员会真的想要(比如,标准化 vtables 的工作方式),您可以使用虚函数标准布局创建类。

一个问题是委员会不想不必要地破坏现有代码。因此,除非有充分的理由,否则他们会尝试标准化现有的做法。如果两个编译器对一个类的布局意见不一致,那么标准化它们的布局成本会更高并且/或产生的 yield 会更少。

标准布局在技术上只是一个标志;从语义上讲,这意味着具有相似选项(如打包)的不同编译器将编译兼容的数据布局。

关于c++ - 为什么 gcc 会发出有关有条件支持的 offsetof 的警告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71006368/

相关文章:

c++ - 在 C++ 中放置派生的新基子对象

c++ - C++ 中的动态开关大小写

java - 自动化多人游戏中的坑洼,玩家可以使用自己的算法

c - 用汇编语言解释这一行?

Snow Leopard Xcode 中的 C++ 调试构建中断

c++:在多线程程序中写入文件

c++ - 多读/单写类的线程安全

c++ - 使用意外声明为函数的对象后解释 GCC 错误

C 扩展 : <? 和 >?运营商

c - 使用 X11 编译文件时出现问题