2017-12-01 7 views

答えて

6

は、それらは互いに([class.mem]/13)に対して増加アドレスを持つことが保証されている:同じアクセス 制御(箇条[クラスを有する(非組合)の

非静的データ・メンバークラス。アクセス])は、後のメンバ がクラスオブジェクト内でより高いアドレスを持つように割り当てられます。

太字のテキストに注意してください。 field2は、両方ともプライベートであるときにfield1の後にあることが保証されていますが、アクセス制御が異なる場合はそうである必要はありません。もちろん、中間パッドは常にオプションです。

しかし、あなたはパディングの有無を強制したい、と彼らは同じ型である場合、配列はそれを行うだろう:

uint64_t field[2]; 

それらのオブジェクトが今、明らかメンバーであるので、それはまた、&field[0] + 1が明確に定義されます同じアレイの

+0

手作業によるアライメント仕様で、パディングが強制的に存在しない可能性がありますか? – Incomputable

+0

ありがとう!質問の更新を見てください:) – vladon

+0

@Incomputable - たぶん。それは私が喜んで言うほど確実です。すべてが*非常に実装が定義されています。 – StoryTeller

4

はい注文は保証されています。

field1のアドレスは、my_class_tのインスタンスのアドレスと同じでなければなりません。 field2は、field1よりも高いアドレスを有し、field1番地のreinterpret_castによって得られたunsigned char*ポインタ上の肯定ポインタ演算は、最終的にfield2が占めるメモリに達する。

しかしfield1へのポインタにポインタ演算によってfield2を「リーチ」しようとする上での動作は未定義であることに注意してください。

メンバ間にパディングがないことを保証するために、ポータブルC++ではこれを行うことはできません。

class my_class_t { 
private: 
    uint64_t fields[2]; 
}; 

ことを保証することになる。しかし、あなたは配列型を使用することができます。そして、は、ポインタ演算を使用してメンバーに到達できます。

0

メモリ内のオブジェクトの順序は、アクセス修飾子が介入しない場合の宣言の順序と同じです。

関連する問題