为什么不同布局兼容类型的两个数组本身也不兼容布局?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么不同布局兼容类型的两个数组本身也不兼容布局?相关的知识,希望对你有一定的参考价值。
[假设struct A
和struct B
与布局兼容,为什么A[N]
和B[N]
与布局不兼容?它的根本问题是什么?
在以下示例中,在ub()
内部通过第二个联合成员访问第一个联合成员会导致未定义的行为。但是,在ok()
中,行为是明确定义的。
struct A int i; ; // A and B are
struct B int j; ; // layout-compatible
union C A a; B b; ;
union D A a[3]; B b[3]; ;
int ok()
C c .a = 1 ; // ok, initialize c.a
return c.b.j; // ok, as if c.a.i were nominated
int ub()
D d .a = 1, 2, 3 ; // ok, initialize d.a
return d.b[0].j; // UB, A[3] and B[3] are
// not layout-compatible
摘录自标准[basic.types]/11(N4861,重点是我的):
如果T1和T2是相同类型,布局兼容的枚举或布局兼容的标准布局类类型,则两种类型的cv1 T1和cv2 T2是布局兼容类型。
[cppreference也提到了这一点,但未赘述。
与布局兼容的数组类型,但是不同的元素类型(忽略cv-qualification)不与布局兼容,即使它们的长度相等。
答案
考虑此:
struct A
alignas(32) int a;
;
struct B
int b;
;
[A
和B
是布局兼容的,但是两者的数组将不是由于A
的数组内部需要额外的对齐方式。
以上是关于为什么不同布局兼容类型的两个数组本身也不兼容布局?的主要内容,如果未能解决你的问题,请参考以下文章