Указатель на объект == указатель на первый член?

Почему условие if в следующем коде возвращает true?

struct A
{
    int firstMember;
} a1;

if (&a1 == static_cast<void*>(&a1.firstMember)) std::cout << "equal";

Я немного запутался, когда читал FAQ Страуструпа о пустых классах, а именно:

if (p1 == p2) cout << "nice: good optimizer";

4 ответа

Решение

В вашем коде нет ссылок. Не путайте оператор "address-of" (также &) со ссылками.

Ваше условие возвращает true, потому что в этом случае случается, что объект начинается в том же месте в памяти, что и его первое (и единственное) поле. Это относится к т.н. объектам POD (plain-old-data), но это не всегда так.

Например, условие может быть ложным, если ваш класс содержит какие-либо виртуальные функции. Не зависит от этого

Оператор ссылки отправляет обратно указатель на адрес памяти, который содержит член.

Здесь a1 является классом, содержащим только firstMember, поэтому структура в памяти является именно этим элементом: начало a1 в памяти совпадает с началом firstMember.

Да, вы не можете зависеть от этого. В частности, в 64-битных ОС компилятор может корректировать адреса для учета выравнивания в памяти.

Ссылка действует так же, как указатель в C++. Когда вы берете ссылку на переменную, вы спрашиваете место в памяти для этой переменной. В этом случае вы сравниваете первый фрагмент информации в a1 с самим a1. Это особый случай, когда это сработает, и на это не стоит полагаться.

Другие вопросы по тегам