次のコードのif条件がtrueになるのはなぜですか?
struct A
{
int firstMember;
} a1;
if (&a1 == static_cast<void*>(&a1.firstMember)) std::cout << "equal";
空のクラスに関するStroustrupのFAQ 、特に以下のステートメントを読んでいると、少し混乱しました。
if (p1 == p2) cout << "nice: good optimizer";
次のコードのif条件がtrueになるのはなぜですか?
struct A
{
int firstMember;
} a1;
if (&a1 == static_cast<void*>(&a1.firstMember)) std::cout << "equal";
空のクラスに関するStroustrupのFAQ 、特に以下のステートメントを読んでいると、少し混乱しました。
if (p1 == p2) cout << "nice: good optimizer";
コードに関係する参照はありません。「address-of」演算子(も&
)を参照と混同しないでください。
この場合、オブジェクトが最初の(そして唯一の)フィールドと同じメモリ内の場所で開始されるため、条件はtrueを返します。これは、いわゆるPOD(plain-old-data)オブジェクトの場合ですが、常に正しいとは限りません。
たとえば、クラスに仮想関数が含まれている場合、条件がfalseになる可能性があります。それに依存しないでください。
参照演算子は、メンバーを含むメモリアドレスへのポインタを送り返します。
ここで、a1はfirstMemberのみを含むクラスであるため、メモリ内の構造はまさにその要素です。メモリ内のa1の先頭は、firstMemberの先頭と同じです。
参照は、C++のポインターのように機能します。変数への参照を取得するときは、その変数のメモリ内の場所を要求しています。この場合、a1の最初の情報をa1自体と比較しています。これはこれが機能する特定のケースであり、信頼できるものではありません。
はい、あなたはそれに頼ることはできません。特に、64ビットOSでは、コンパイラはメモリ内のアラインメントを考慮してアドレスを調整する場合があります。