这两个结构布局兼容吗?
struct One {
float x, y, z;
};
struct Two {
float c[3];
};两者都包含3个浮点数,因此在某种程度上,这个描述可以被认为是正确的(来自N3797):
16两个标准布局结构(第9条)类型是布局兼容的,如果它们具有相同数量的非静态数据成员,相应的非静态数据成员(按声明顺序)具有与布局兼容的类型(3.9)。
N4659有一个不同的文本:
两个标准布局结构(第12条)类型的公共初始序列是非静态数据成员的最长序列,位-fi屏蔽按声明顺序排列,从每个结构中的first这样的实体开始,这样相应的实体具有与布局兼容的类型,或者两个实体都不是位field,或者两者都是相同宽度的位fi屏蔽。 两个标准布局结构(第12条)类型是布局兼容的类,如果它们的公共初始序列包含两个类的所有成员和位fi屏蔽(6.9)。
如果答案是否定的,则它们的布局不兼容,那么:这是否委员会的意图?也许他们确实希望One和Two能够与布局兼容(也许委员会成员会读到这篇文章,并且可以澄清)。
额外的问题:它是否保证,sizeof(One)==sizeof(Two)
发布于 2017-07-26 16:41:20
嗯,不:
..。如果他们有相同数量的非静态数据成员.
One有三个成员:x、y和z。Two有一个成员:c。它们没有相同数量的非静态数据成员,因此它们的布局不兼容。
新的措辞是不同的,但你最终会在同一个地方。[basic.types]将布局兼容定义为:
cv1 T1和cv2 T2两种类型是布局兼容类型,如果T1和T2类型相同,则为布局兼容枚举或布局兼容标准布局类类型。
[class.mem]定义的布局兼容类如下:
两个标准布局结构类型是布局兼容类,如果它们的公共初始序列包含两个类的所有成员和位字段(basic.types)。
其中共同的初始序列是:
两个标准布局结构类型的公共初始序列是按声明顺序排列的最长的非静态数据成员和位字段序列,从每个结构中的第一个这样的实体开始,这样相应的实体具有与布局兼容的类型,或者两个实体都不是位字段,或者都是宽度相同的位字段。
在这里,One (float x)的第一个成员与Two (float c[3])的第一个成员不兼容,因此公共初始序列是空的。
发布于 2017-07-26 16:57:40
编译器可以在class或struct中的成员之间添加填充。
数组元素位于相邻位置。
它们可能不兼容布局,这取决于编译器如何在struct中组织成员。
https://stackoverflow.com/questions/45332326
复制相似问题