Are structs of variables of the same type layout compatible with a struct containing an array of that type?

后端 未结 2 710
孤独总比滥情好
孤独总比滥情好 2020-12-11 00:41

Are these 2 structs layout-compatible?

struct One {
    float x, y, z;
};

struct Two {
    float c[3];
};

Both contains 3 floats, so in a

相关标签:
2条回答
  • 2020-12-11 01:23

    The compiler is allowed to add padding between members in a class or struct.

    Array elements are in contiguous locations.

    They may not be layout compatible depending on how the compiler organizes the members in the struct.

    0 讨论(0)
  • 2020-12-11 01:25

    Well, no:

    [...] if they have the same number of non-static data members [...]

    One has three members: x, y, and z. Two has one member: c. They don't have the same number of non-static data members, therefore they aren't layout compatible.


    The new wording is different but you end up at the same place. [basic.types] defines layout-compatible as:

    Two types cv1 T1 and cv2 T2 are layout-compatible types if T1 and T2 are the same type, layout-compatible enumerations, or layout-compatible standard-layout class types.

    [class.mem] defines layout-compatible classes are:

    Two standard-layout struct types are layout-compatible classes if their common initial sequence comprises all members and bit-fields of both classes ([basic.types]).

    Where the common initial sequence is:

    The common initial sequence of two standard-layout struct types is the longest sequence of non-static data members and bit-fields in declaration order, starting with the first such entity in each of the structs, such that corresponding entities have layout-compatible types and either neither entity is a bit-field or both are bit-fields with the same width.

    Here, the first member of One (float x) is not layout-compatible with the first member of Two (float c[3]), so the common initial sequence is empty.

    0 讨论(0)
提交回复
热议问题