结构前缀的布局

Layout for struct prefix

本文关键字:布局 前缀 结构      更新时间:2023-10-16

C/C++ 语言不会对内存中的结构成员重新排序,也不会在第一个成员之前插入填充。 但是,如果我有 2 个以相同成员开头的结构,如果我只访问公共成员,我可以在它们之间转换吗? 换句话说,结构布局是贪婪的吗? 我的具体案例是在视频信息标题和VIDEOINFOHEADER2之间铸造

C++标准包含以下声明,但仅适用于工会(9.2 [class.member] 第19段):

如果标准布局联合包含

两个或多个共享公共初始序列的标准布局结构,并且标准布局联合对象当前包含其中一个标准布局结构,则允许检查其中任何一个结构的公共初始部分。如果相应的成员具有布局兼容的类型,并且两个成员都不是位字段,或者两者都是具有相同宽度的位字段,则两个标准布局结构共享一个公共初始序列。

我没有看到 C 或 C++ 标准中关于部分定义的结构的任何其他保证。不过,这并不意味着它不存在,只是我没有通过快速扫描几个相关部分找到它。

简短的回答:是的。主要。

编译器无法对结构成员重新排序:true。 我不太确定填充,IFAIR 结构成员对齐是实现定义的。

但是,编译器在布局结构时是一致的。 它必须是,否则你永远不会能够写入然后读回文件的结构。大多数编译器使用"理智"规则进行结构布局,因此您可以从一个程序编写并使用另一个程序读入,即使它们是不同系统上的不同编译器。

大多数时候。 结构布局没有明确定义的规则。 因此,偶尔你会因为依靠"自然"布局来匹配而被咬,当它不匹配时。 但在这种情况下,你应该是安全的。

我相信

它不能保证在理论上有效,但它很可能永远有效。除了在结构的第一个成员(在 C 中)之前没有填充之外,无法保证成员之间存在什么填充,因此理论上两个结构可以具有不同的布局。但实际上,对于您能想到的大多数填充规则,您会期望两者的填充相同。

您可以做的(但不在您的特定示例中)是使用单个成员(另一个结构)启动两个结构,并强制转换为指向第一个成员的指针。