2010-11-29 12 views

答えて

18

あなたのコードに関わる一切の言及はありません。 "アドレスの"演算子(また&)と参照を混同しないでください。

この場合、オブジェクトは最初の(かつ唯一の)フィールドとしてメモリ内の同じ場所で開始されるため、条件がtrueを返します。つまり、いわゆるPOD(plain-old-data)オブジェクトの場合ですが、必ずしもそうではありません。

たとえば、クラスに仮想関数が含まれていると条件がfalseになる可能性があります。それに頼らないでください。

+0

よく置いて非常に簡潔です。 +1 –

+1

私が追加する唯一のことは、コンパイラがオブジェクトをメモリ内で整列させようとして、後続のメンバの配置を狂わせるかもしれないということです。これは、パディングと呼ばれ、この種の型を、特にコンパイラのプラグマやフラグによって異なる可能性があるため、さらに危険なものにします。 Pack(1)は多くのコンパイラで動作し、パディングをオフにします。これをしないでください、いくつかの非常に良い理由があります。これらの理由やユースケースに特有の反論を明確にすることができない限り、Pack(1)は必要ありません。 –

0

リファレンスはC++のポインタとよく似ています。変数への参照を取得すると、その変数のメモリ内の場所を尋ねてきます。この場合、a1の最初の情報をa1自体と比較しています。これはこれがうまくいく特定のケースであり、あなたが頼りにするべきものではありません。

+2

ここには参考文献はありません。 '&a1'と'&a1.firstMember'は実際にはポインタです。 – aschepler

1

参照演算子は、メンバを含むメモリアドレスへのポインタを返す。

ここで、a1はfirstMemberのみを含むクラスなので、メモリ内の構造はその要素です。メモリ内のa1の先頭はfirstMemberの先頭と同じです。

+0

ここには参考文献はありません。 @ Kosの答えを見てください。 – aschepler

0

はい、あなたはそれに頼ることはできません。特に、64ビットOSでは、コンパイラがメモリ内のアラインメントを考慮してアドレスを調整することがあります。

関連する問題