Когда мы объявляем объект класса, является ли его выделение памяти последовательным (одно за другим)?
Стандарт не дает такой гарантии.Расположение памяти объекта определяется реализацией.
Обычно адрес памяти для элементов данных увеличивается в порядке, в котором они определены в классе.Но этот порядок может быть нарушен в любом месте, где встречаются спецификаторы доступа (private
, protected
, public
).Это было подробно обсуждено в Внутри объектной модели C ++ Lippman .
Отрывок из Журнала пользователей C / C ++ ,
Однако компилятору не разрешается делать эту перестановку самостоятельно.Стандарт требует, чтобы все данные, которые находятся в в том же public :, protected: или private: были размещены компилятором в таком порядке. Если вы добавляете свои данные в спецификаторы доступа, то компилятору разрешается переупорядочивать блоки данных, разделенные спецификатором доступа, для улучшения макета , , поэтому некоторым людям нравится помещать спецификатор доступаперед каждым элементом данных .
Интересно, не правда ли?