Модель памяти класса C ++ и выравнивание - PullRequest
4 голосов
/ 30 июля 2011

У меня есть несколько вопросов, которые касаются положения и выравнивания данных в C ++. У классов есть то же самое размещение памяти и формат выравнивания памяти как структуры?

Точнее, загружаются ли данные в память в порядке их объявления? Влияют ли функции на выравнивание памяти и положение данных или они расположены в другом месте? Вообще говоря, я сохраняю все свои данные, связанные с выравниванием памяти и позицией, такие как заголовки файлов и алгоритмические данные в структуре Мне просто любопытно узнать, является ли это присущим классам так же, как и структурам, и будет ли оно хорошо переводиться в классы, если я выберу такой подход.

Редактировать: Спасибо за все ваши ответы. Они действительно очень помогли.

Ответы [ 4 ]

5 голосов
/ 30 июля 2011

Имеют ли классы одинаковое размещение в памяти и формат выравнивания памяти как устроен?

Размещение / выравнивание объектов в памяти не зависит от того, был ли их тип объявлен как 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 с простым присваиванием.

1 голос
/ 30 июля 2011

Имеют ли классы такое же расположение в памяти и формат выравнивания памяти, как у структур?

Да. Технически нет никакой разницы между классом и структурой. Единственное отличие заключается в спецификации доступа к элементу по умолчанию, в противном случае они идентичны.

Точнее, загружаются ли данные в память в порядке их объявления?

Да.

Влияют ли функции на выравнивание памяти и положение данных или они расположены в другом месте?

Нет. Они не влияют на выравнивание. Методы составляются отдельно. Объект не содержит никаких ссылок на методы (для тех, которые говорят, что виртуальные таблицы влияют на члены, ответ да и нет, но это деталь реализации, которая не влияет на относительную разницу между членами. Компилятору разрешено добавлять специфичные для реализации данные к объекту).

Вообще говоря, все структуры, связанные с выравниванием памяти и позицией, хранятся в структуре, например, заголовки файлов и алгоритмические данные.

OK. Не уверен, как это повлияет на что-либо.

Мне просто любопытно узнать, является ли это присущим классам так же, как и структурам

Класс / Составляет другое имя для одной и той же вещи.

и будет ли он хорошо переводиться в классы, если я выберу этот подход.

Выберите какой подход?

0 голосов
/ 30 июля 2011

Классы C ++ не участвуют в «постоянстве», как структуры в двоичном режиме, и к ним не должно быть привязки.Держите классы простыми.Выравнивание с классами может иметь отрицательные преимущества производительности и может иметь побочные эффекты.

0 голосов
/ 30 июля 2011

C ++ классы просто переводятся в структуры со всеми переменными экземпляра как данные, содержащиеся в структурах, в то время как все функции отделены от класса и обрабатываются как функции, принимающие эти структуры в качестве аргумента.

Точный способ хранения переменных экземпляра зависит от используемого компилятора, но обычно они имеют тенденцию быть в порядке.

...