Имеют ли классы одинаковое размещение в памяти и формат выравнивания памяти
как устроен?
Размещение / выравнивание объектов в памяти не зависит от того, был ли их тип объявлен как class
или struct
. Единственное отличие между class
и struct
в C ++ состоит в том, что класс имеет private
членов по умолчанию, в то время как структура имеет public
членов по умолчанию.
Более конкретно, данные загружаются в память на основе порядка в
который объявлен?
Я не уверен, что вы подразумеваете под "загружен в память". Однако внутри объекта компилятору не разрешается переставлять переменные. Например:
class Foo {
int a;
int b;
int c;
};
Переменные c
должны быть расположены после b
, а b
должны быть расположены после a
в Foo
объекте. Они также создаются (инициализируются) в порядке, указанном в объявлении класса при создании Foo
, и уничтожаются в обратном порядке при уничтожении Foo
.
На самом деле все сложнее из-за наследования и модификаторов доступа, но это основная идея.
Влияют ли функции на выравнивание памяти и положение данных или они
выделено в другое место?
Функции не являются данными, поэтому их выравнивание не имеет значения. В некоторых форматах исполняемых файлов и / или архитектурах двоичный код функции фактически занимает отдельную область от переменных данных, но язык C ++ не зависит от этого факта.
Вообще говоря, я сохраняю все свои настройки памяти и положение
зависимые вещи, такие как заголовки файлов и алгоритмические данные в
структура. Мне просто любопытно узнать, является ли это присущим
классы, как это должно структурировать и будет ли это хорошо переводить
в классы, если я решил использовать этот подход.
Выравнивание памяти - это то, что компилятор почти автоматически позаботится о вас. Это больше детали реализации, чем все остальное. Я говорю «почти автоматически», поскольку существуют ситуации, когда это может иметь значение (сериализация, ABI и т. Д.), Но в приложении это не должно вызывать беспокойства.
Что касается чтения файлов (поскольку вы упоминаете заголовки файлов), это звучит так, как будто вы читаете файлы непосредственно в память, занятую struct
. Я не могу рекомендовать такой подход, поскольку проблемы с отступами и выравниванием могут заставить ваш код работать на одной платформе, а не на другой. Вместо этого вы должны прочитать необработанные байты по паре из файла и назначить их в struct
с простым присваиванием.