Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 结构前缀的布局_C++_C_Struct_Casting - Fatal编程技术网

C++ 结构前缀的布局

C++ 结构前缀的布局,c++,c,struct,casting,C++,C,Struct,Casting,C/C++语言不会对内存中的结构成员重新排序,也不会在第一个成员之前插入填充。但是如果我有两个以相同成员开头的结构,如果我只访问公共成员,我可以在它们之间进行强制转换吗?换句话说,结构布局贪婪吗?我的具体案例是在Sub和 < P>之间,C++标准包含以下语句,但仅适用于工会(9.2 [类成员]第19段): 如果标准布局联合包含两个或多个共享公共初始序列的标准布局结构,并且如果标准布局联合对象当前包含其中一个标准布局结构,则允许检查其中任何一个的公共初始部分。如果对应的成员具有布局兼容类型,并且两

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

< P>之间,C++标准包含以下语句,但仅适用于工会(9.2 [类成员]第19段):

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


我没有看到任何关于C或C++标准中的部分定义结构的保证。但这并不意味着它不在那里,只是我没有通过快速浏览几个相关章节找到它。

简短回答:是的。大部分

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

但是,编译器在布局结构时是一致的。必须这样,否则你永远不会这样 能够将结构写入并读回文件。大多数编译器对结构布局使用“健全”规则,因此您可以从一个程序写入,也可以从另一个程序读入,即使它们是不同系统上的不同编译器


大多数时候。结构布局没有精确定义的规则。所以有时候你会因为依赖“自然”的布局来匹配而被咬,而事实并非如此。但是在这种情况下,你应该是安全的。

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


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

您编写的内容与
struct
vs
class
(正如您的问题所想)以及与标准布局类型(以前的布局类型)有关“纯旧数据”)。编译器当然可以对不符合标准布局要求的
结构的成员重新排序。如果结构具有虚拟成员或多个访问块(
私有:
公共:
受保护:
),编译器可以对结构成员重新排序很好的发现。我认为答案是布局将是兼容的,因为编译器无法知道我是否在同一个联合中使用了两个结构,但实际上在结构之间强制转换可能会混淆别名分析器(联合除外)。