Ответ 1
Ответ зависит от языковой версии, потому что это изменилось с С++ 03 на С++ 11.
В С++ 03 это правило было:
Члены одного и того же блока управления доступом (то есть от одного из ключевых слов
public
,protected
,private
к следующему из этого набора) должны выделяться в порядке объявления внутри класса, не обязательно смежно.
В С++ 11 правило было изменено на следующее:
Члены с одним и тем же уровнем контроля доступа (public, protected, private) должны быть выделены в порядке декларации внутри класса, не обязательно смежно.
Итак, в С++ 03 вы можете гарантировать это (я использую @
для обозначения смещения члена внутри класса):
-
@m_ac < @m_scp
-
@m_i1 < @m_i2 < @m_b1 < @m_b2
В С++ 11 у вас есть еще несколько гарантий:
-
@m_ac < @m_scp
-
@m_sc < @m_i1 < @m_i2 < @m_b1 < @m_b2
-
@m_name < @m_b3
В обеих версиях компилятор может переупорядочить членов в разных цепочках по своему усмотрению и может даже чередовать цепочки.
Обратите внимание, что есть еще один механизм, который может войти в изображение: классы стандартного макета.
Класс является стандартным макетом, если он не имеет виртуальных машин, если все его нестатические члены данных имеют одинаковое управление доступом, у него нет базовых классов или нестатических элементов данных типа нестандартного макета или ссылочного типа, и если он имеет не более одного класса с любыми нестатическими членами данных в своей цепочке наследования (т.е. он не может определять свои собственные нестатические элементы данных и наследовать некоторые из базового класса).
Если класс является стандартным макетом, есть дополнительная гарантия того, что адрес его первого нестатического элемента данных идентичен адресу самого объекта класса (что просто означает, что заполнение не может присутствовать в начале класс).
Обратите внимание, что условия стандартного макета, а также практические компиляторы, не делающие пессимистических выборов, эффективно означают, что в классе стандартного макета члены будут упорядочены в порядке объявления (с добавлением пополнения для выравнивания при необходимости).