Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
190 views
in Technique[技术] by (71.8m points)

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

Are these 2 structs layout-compatible?

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

struct Two {
    float c[3];
};

Both contains 3 floats, so in a way, this description can be considered true (from N3797):

16 Two standard-layout struct (Clause 9) types are layout-compatible if they have the same number of non-static data members and corresponding non-static data members (in declaration order) have layout-compatible types (3.9).

N4659 has a different text:

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

Two standard-layout struct (Clause 12) types are layout-compatible classes if their common initial sequence comprises all members and bit-?elds of both classes (6.9).

If the answer is no, they are not layout-compatible, then: was it the intention of the committee? Maybe they do want One and Two to be layout-compatible (maybe a committee member reads this, and can clarify).


Bonus question: is it guaranteed, that sizeof(One)==sizeof(Two)?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

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.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...