C / C ++语言不会对内存中的struct成员重新排序,也不会在第一个成员之前插入填充。但是如果我有两个以相同成员开头的结构,如果我只访问公共成员,我可以在它们之间进行转换吗?换句话说,结构布局是贪婪的吗?我的具体案例是在VIDEOINFOHEADER和VIDEOINFOHEADER2
之间进行投射答案 0 :(得分:4)
C ++标准包含以下语句,但仅适用于联合会(9.2 [class.member]第19段):
如果标准布局联合包含两个或多个共享公共初始序列的标准布局结构,并且标准布局联合对象当前包含这些标准布局结构中的一个,则允许检查公共初始他们中的任何一个。如果相应的成员具有布局兼容类型且两个成员都不是位字段,或者两者都是具有相同宽度的位字段,则一个或多个初始成员的序列,两个标准布局结构共享一个共同的初始序列。
对于C或C ++标准中的部分定义结构,我没有看到任何其他保证。但这并不意味着它不存在,只是我没有通过快速扫描几个相关部分找到它。
答案 1 :(得分:1)
简短回答:是的。居多。
编译器无法重新排序struct成员:true。我对填充不太确定,IFAIR结构成员对齐是实现定义的。
但是,在布局结构时,编译器一致。它必须是,或者你永远不会 能够编写然后将结构读回文件。大多数编译器对结构布局使用“理智”规则,因此您可以从一个程序编写并使用另一个程序读入,即使它们是不同系统上的不同编译器。
大多数的时间。结构布局没有明确定义的规则。因此偶尔会依靠“自然”布局来匹配,当它没有时。但在这种情况下,你应该是安全的。
答案 2 :(得分:1)
我认为它不能保证在理论上有效,但它很可能永远有效。除了在结构的第一个成员之前没有填充(在C中),不能保证成员之间存在填充,因此理论上两个结构可以具有不同的布局。但实际上,对于大多数填充规则,您可以预期填充是相同的。
你可以做什么(不是在你的具体例子中)是使用单个成员启动两个结构,这是另一个结构,并转换为指向第一个成员的指针。