为什么不同布局兼容类型的两个数组本身也不兼容布局?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么不同布局兼容类型的两个数组本身也不兼容布局?相关的知识,希望对你有一定的参考价值。

[假设struct Astruct 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;
;

[AB是布局兼容的,但是两者的数组将不是由于A的数组内部需要额外的对齐方式。

以上是关于为什么不同布局兼容类型的两个数组本身也不兼容布局?的主要内容,如果未能解决你的问题,请参考以下文章

第33章 项目实战-兼容式响应布局3

第33章 项目实战-兼容式响应布局1

响应式布局

微信小程序不同机型的兼容布局解决

Flex布局

Flex布局