布局兼容类型的目的是什么?

What's the purpose of layout-compatible types?

当两种类型 布局兼容 时,标准 defines。但是,我在标准中的任何地方都看不到当两种类型 布局兼容 时会产生什么后果。似乎 layout-compatible 是一个未在任何地方使用的定义。

布局兼容的目的是什么?

注意:据推测,这可能意味着类型具有相同的布局(offsetof 对于每个对应的成员都是相同的),因此例如,对于平凡可复制的类型,可以在它们之间复制底层字节.但是我在标准中没有看到这样的东西。

该标准确实定义了一种布局兼容性很重要的特定情况:在 union 秒内。如果两个成员是布局兼容的,并且其中一个是活动 union 成员,那么您可以通过 pointers/references 访问该对象到 union 的任何布局兼容成员。这是 the "common initial sequence" rule.

的结果

该标准并未尝试强制所有实现都适用于所有目的。因此,旨在适用于超出标准需要支持的目的的质量实现通常需要扩展语言的语义。他们可以做到这一点的最简单和最有用的方法之一是说,在某些情况下,标准的某些部分定义或暗示某些动作的行为,但另一部分说重叠的动作类别调用 UB,他们将处理行为作为由前面的部分定义或暗示。例如,在许多编译器上,有一个选项(通常使用 -fno-strict-aliasing 标志启用)表示任何在没有类型访问规则的情况下定义其行为的程序都将以这种方式处理,即使这些规则会说程序调用 UB。

虽然在相对较少的情况下,两个结构布局兼容的事实会导致行为由标准定义,而在其他情况下则不会,但在许多情况下,它暗示了实现必须如何表现在没有这些类型访问规则的情况下(通过使实现基本上不可能做任何其他事情)。例如,如果结构类型 T1 和 T2 是布局兼容的,这表明如果指向 T1 的指针转换为 T2*,则使用后者指针对结构成员的任何操作都将访问 T1 对象的相应成员。

因为不是所有的程序都需要这样的能力,所以标准不要求所有的实现都提供它们。另一方面,适用于低级编程的实现将提供一些方法,通过这些方法,设计用于处理一种类型的代码部分可以用于可互换地处理布局兼容类型,无论标准是否要求它们(不这样做的实现将仅限于低级编程以外的用途。

我认为,通过正式承认适用于低级编程的实现类别和其他未声称适合的实现类别,而不是试图为所有实现定义一组行为,我认为该标准将得到极大的改进。尽管如此,定义像 "layout compatibility" 这样的概念极大地提高了可移植结构的范围 在适用于低级编程的实现中