Указатель на объект == указатель на первый член?
Почему условие 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. Это особый случай, когда это сработает, и на это не стоит полагаться.