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

标签 c++ c pointers struct

我也有类似的情况

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

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

Father tilemap[WIDTH][HEIGHT];

现在我才意识到我想为 x,y 保存四个字节,对于同一父亲的两个 child ,它们始终设置为相同的值。

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

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

这里真正的问题是我在传递 Child* 时不知道它是 child1 还是 child2 字段,所以我不能直接知道偏移量来恢复父亲的地址(以及坐标)。我是想在 Child 级别使用一点来区分它们,但我是否能够轻松恢复父亲的地址?

如有任何建议,我们将不胜感激

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

最佳答案

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

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

当然,在 C++ 中,只有当它是标准布局类型时,这才是正确的,也就是说,一个类或结构没有公共(public)/私有(private)/ protected 混合成员,没有虚函数和没有从其他类继承的成员。

关于c++ - C/C++ 结构中字段的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9115020/

相关文章:

android - 潜望镜时间戳

c++ - 四叉树不会插入节点或拆分

将结构转换为指向其第一个元素的指针类型

c++ - 迭代时将指针保存到 std::vector 中的不同类型

c - 如何在 C 中从 char** 转换为 char*?

c - 反转链表而不修改头指针

c++ - 如何在Windows CE环境下使用UnitTest++?

c++ - C++中的模板成员函数重载和多重继承

c++ - 温度将两个 int 数字转换为 float

c - 同步访问共享内存