указатель на объект == указатель на первый член? - PullRequest
1 голос
/ 30 ноября 2010

Почему условие 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 ]

18 голосов
/ 30 ноября 2010

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

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

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

1 голос
/ 30 ноября 2010

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

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

0 голосов
/ 30 ноября 2010

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

0 голосов
/ 30 ноября 2010

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

...