В C, да, это тот же адрес. Простой и понятный.
В C++ нет, они не совпадают. Базовые классы могут (и я подозреваю, делаю) приходить перед всеми членами, а функции виртуальных членов обычно добавляют скрытые данные в структуру где-то. Еще более запутанным, компилятор C++ может также переупорядочить элементы по своему желанию, если только класс не является стандартным типом макета (хотя я не знаю, что какой-либо компилятор делает это)
Наконец, если структура C++ состоит из типы макетов, не содержит базовых классов и виртуальных функций, и все члены имеют одинаковую видимость и, возможно, другие ограничения, которые я забыл, затем, он возвращается к правилам C и требует, чтобы первый член находился на том же адресе, что и сам объект.
§ 9,2/7
Класс стандартной компоновки является классом, который:
- не имеет нестатических элементов данных класса типа нестандартного типа макета (или массив таких типов) или справочник,
- не имеет виртуальные функции (10.3) и никаких виртуальных базовых классов (10.1),
- имеет тот же контроль доступа (пункт 11) для всех нестатических элементов данных,
- не имеет нестандартное- базовые классы макета,
- либо не имеет нестатических элементов данных в самом производном классе и не более одного базового класса с нестатическими членами данных или не имеет базовых классов с нестатическими элементами данных, а
- не имеет базовых классов того же типа, что и первый нестатический элемент данных ,
§ 9.2/20
указатель на объект структуры стандартной компоновки, соответствующим образом преобразованы с использованием reinterpret_cast, указывает на его начальном элементе (или, если этот член битовое поле, а затем в блок, в котором он находится) и наоборот. [Примечание. Таким образом, в рамках объекта структуры стандартного макета может быть указано неназванное заполнение, но не в его начале, по мере необходимости, для достижения соответствующего выравнивания. -end note]
Это не то же самое в этом отношении –
@MooingDuck: Ну, это зависит от того, что такое '...'. Для того же определения структуры C++ будет обрабатывать его так же, как структуры C (C всегда соответствуют стандарту C++ *). –