C/C++ 结构中的字段顺序

Jac*_*ack 2 c c++ struct pointers

我有类似的情况

struct Child
{
  u16 x, y;
  // other fields
};

struct Father
{
  struct Child child1;
  struct Child child2;
  // other fields
};

Father tilemap[WIDTH][HEIGHT];
Run Code Online (Sandbox Code Playgroud)

现在我才意识到我想为 x,y 保存四个字节,对于同一个父亲的两个孩子,这些字节总是设置为相同的值。

在我的代码周围Father*,我传递了很多很多,Child*同时分别使用father->child1->x或恢复坐标child1->x。我想安全地在Father水平上移动坐标,但我不确定一些事实。

与 gcc/g++ 的任何优化或可能实现相比,是否会遵守声明字段的顺序?我能有信心&father == &father.child1吗?

这里真正的问题是我在Child*不知道它是 child1 还是 child2 字段的情况下通过,所以我不能直接知道偏移量来恢复父亲的地址(以及坐标)。我想在Child级别上使用一点来区分它们,但会那么我可以轻松地恢复父亲的地址吗?

任何建议将不胜感激,谢谢

编辑:作为进一步的信息,我使用 C++ 作为我的主要语言,但这些结构不包含任何奇怪的方法,只有字段和空的构造函数。

rod*_*igo 7

C 中关于字段布局的一般规则是:

  1. 第一个成员的地址与结构本身的地址相同。即offsetof成员字段的 为 0。
  2. 成员的地址总是按声明顺序增加。即,第offsetofn个字段的小于第(n+1)个成员的。

当然,在 C++ 中,只有当它是标准布局类型时才是正确的,即粗略地说,一个没有公共/私有/保护混合成员、没有虚函数和没有从其他类继承的成员的类或结构。