2017-07-26 6 views
15

これらの2つの構造体はレイアウトに対応していますか?同じ型レイアウトの変数の構造体は、その型の配列を含む構造体と互換性がありますか?

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

struct Two { 
    float c[3]; 
}; 

ように、この説明は(N3797からの)真とみなすことができるので、3台のフロートが含ま両方:タイプのレイアウト互換 ある

16 2つの標準レイアウト構造体(条項9)それらが同じ数の非静的データメンバーを持ち、 対応する非静的データメンバー(宣言順)が のレイアウト互換型(3.9)である場合。

N4659は異なるテキストを有する2つの標準的なレイアウト構造体(条項12) タイプの

共通の初期シーケンスは、非静的データメンバの最長シーケンスとbit-のfi ELDより でありますエンティティがビットマップフィールドであるか、またはその両方が同じ幅を有するビットフィールドであるかのいずれかであるような、構造体のそれぞれの最初のエンティティから始まる。

共通の初期シーケンスがすべてのメンバーで構成され、両方のクラス(6.9)のビットフィールドが の場合、2つの標準レイアウト構造(12節)タイプはレイアウト互換の クラスです。

答えはされていない場合、彼らはその後、レイアウト互換性がありません:それは、委員会の意向でしたか?おそらく彼らはOneTwoをレイアウト互換にしたいと思うかもしれません(委員会のメンバーがこれを読んで、明確にするかもしれません)。


ボーナスの質問:それは、sizeof(One)==sizeof(Two)を保証しますか?

+3

それぞれ3つの浮動小数点数を含むことができますが、最初のものは3つのメンバを持ち、2番目のものは1つしかありません。それは 'std :: complex'がこれを行うことを許されていると私は確信していません – NathanOliver

+0

サイズは同じである –

+0

**アライメント**について考える。 ..それは4バイトより大きい**そして**ない。しかし、あなたはそれを強制することができます(携帯ではありません)。 As-isコンパイラは最適なものを自由に行うことができます(最適化のターゲットとアーキテクチャの制限に従って)。 –

答えて

10

まあ、ない:

[...]彼らは非静的データメンバの数が同じ場合は、[...]

Oneは3人のメンバーがあります:xyを、およびzTwoのメンバーは、cです。それらは静的でないデータメンバーと同じ数を持たないため、レイアウトに適合しません。


新しい表現は異なりますが、同じ場所で終わります。 [basic.types]は、のようにレイアウトと互換性の定義:

二種類CV1 T1およびCV2のT2 T1及びT2は同じタイプ、レイアウト互換列挙、またはレイアウトと互換性標準レイアウト・クラス・タイプである場合、レイアウト互換型です。

[class.mem]レイアウト互換クラスを定義している:それらの共通の初期シーケンスは、すべてのメンバーとの両方のクラスのビットフィールドは、([基本含む場合

2つの標準レイアウト構造体のタイプは、レイアウトと互換性のクラスです。タイプ])。

共通の初期シーケンスである:

つの標準レイアウト構造体タイプの共通の初期シーケンスが始まる、宣言のために、非静的データメンバとビットフィールドの最長シーケンスであります対応するエンティティがレイアウト互換型を持ち、どちらもエンティティがビットフィールドでないか、または両方が同じ幅を持つビットフィールドであるように、各構造体の最初のエンティティです。ここ

Onefloat x)の最初のメンバーは、レイアウト互換Twofloat c[3])の第一部材としないので、共通の初期シーケンスは空です。

+0

しかし、新しい言葉遣いは、メンバーではなく、 "実体"という言葉を使用します。ここでは「エンティティ」を関連付けることができます。 xはc [0]、yはc [1]、zはc [2]である。私は間違ったトラックにいますか? – geza

+0

@geza http://eel.is/c++draft/basic#3.sentence-1 – Barry

+0

私は 'c [0]'を値の実体として扱うことができます。彼らはなぜここにエンティティを使用したのですか?彼らはメンバーを使用していた可能性がありますが、何らかの理由でエンティティを選択します。私はあなたが間違っていると言っているわけではありません、それは十分に説得力がないだけです。たぶん、テキストをより正確にすることができます。 – geza

2

コンパイラは、メンバー間で、classまたはstructにパディングを追加することができます。

配列要素は連続した位置にあります。

は、コンパイラがstructのメンバーを編成する仕方によってはレイアウト互換性がありません。

関連する問題