2017-03-05 6 views
2

は、私たちがこのようなオブジェクトaを持っていると言う:`this 'を通して他のオブジェクトにアクセスする定義?

struct B { 
    void access_a() { 
    A* a = reinterpret_cast<A*>(reinterpret_cast<char*>(this) 
           - offsetof(A, b)); 
    // is accessing a here well defined, assuming this object 
    // is one that is inside struct A? 
    } 
}; 
struct A { 
    /* one or more standard layout types before b */ 
    B b; 
} a; 

a.b.access_a(); 

理論的には、我々は確かにAのインスタンスを指すポインタを持っており、少なくとも特定の状況下で(醜い)この種のコードが意図しているものやっているようです。それはよく定義されていますか?コンパイラは、オブジェクトの1つのメンバーへのアクセスが他のオブジェクトを変更しないと仮定できますか(アクセスされたオブジェクト自体に親へのポインタが含まれていない場合)、またはすべての子オブジェクトは何らかの共有可変グループに属していますか?

+0

*オブジェクトの1つのメンバーにアクセスすることによって、他のメンバーを変更しないとはどういう意味ですか?メンバーアドレスを変更することを意味しますか?または、コンパイラが他のメンバーに含まれる値が変更されないと想定するかどうかを知りたいですか?それは最初の質問にどのように関連していますか?私は潜在的な*変更可能なグループに関する質問を理解しようとしています*。 – wally

+0

可能な複製:http://stackoverflow.com/questions/1453393/legit-uses-of-the-offsetof-macro-in-cc –

+0

有効な質問ですが、実際のコードでこれを使用したい場合に備えて:This *強く*壊れたクラスデザインのようなにおいがします。 –

答えて

0

PODタイプでのみ使用できるoffsetofマクロを使用すると、1つの問題が発生する可能性があります。

(ウィキ:)

Aプレインオールドデータ構造C++のメンバとしてのみポッドを含んでいる集約クラスは、ユーザ定義のデストラクタ、ユーザ定義のコピー代入演算子、およびno非静的を有していませんメンバへのポインタ型のメンバ

だから限り、あなたのstruct Aは、上記のルールに適合するように定義されている、動作することが保証されます(ただし、実際のように、それは悪い習慣と醜いコードで述べました)。しかし、そうでなければ、あなたはundefined behaviourです。

関連する問題