gpt4 book ai didi

c++ - C/C++ 结构内存布局等效

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:03:13 26 4
gpt4 key购买 nike

考虑以下 C 结构和 C++ 结构声明:

extern "C" { // if this matters
typedef struct Rect1 {
int x, y;
int w, h;
} Rect1;
}

struct Vector {
int x;
int y;
}

struct Rect2 {
Vector pos;
Vector size;
}
  • Rect1的内存布局和 Rect2对象总是相同的?

  • 具体来说,我能安全吗reinterpret_cast来自 Rect2*Rect1*并假设所有四个 int Rect2 中的值对象一对一匹配到四个intRect1 ?

  • 如果我改变 Rect2 会有什么不同吗?到非 POD 类型,例如通过添加构造函数?

最佳答案

  • 我会这么认为,但我也认为 Rect2::posRect2::size 之间可以(合法地)填充。所以为了确保,我会添加特定于编译器的属性来“打包”字段,从而保证所有 int 都是相邻且紧凑的。这不是关于 C 与 C++ 的关系,更多的是关于您在使用两种语言进行编译时可能使用两种“不同”编译器的事实,即使这些编译器来自同一供应商。
  • 使用reinterpret_cast 将指向一种类型的指针转​​换为指向另一种类型的指针,您可能会违反“严格的别名”规则。假设您之后取消引用指针,在这种情况下您会这样做。
  • 添加构造函数不会改变布局(尽管它会使类成为非 POD),但在两个字段之间添加访问说明符如 private 可能会改变布局(实际上,不仅理论上)。

关于c++ - C/C++ 结构内存布局等效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27832888/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com