Где хранятся структуры и классы, написанные на C ++? - PullRequest
2 голосов
/ 27 августа 2011

В C # классы хранятся в куче, а структуры хранятся в стеке.

Сохраняются ли в C ++ классы и структуры одинаково (если я создаю свои классы и структуры статически, а каждый член класса или структуры не выделяется новым)?это с использованием фрагмента кода ниже:

class B
{
int b;
}

class C
{
int c;
}

class A
{
B b;
C c;
int x;
}

struct SB
{
int sb;
}

struct SC
{
int sc;
}

struct SA
{
SB sb;
SC sc;
int x;
}

void main()
{
A a1;
A *a2 = new A;

SA sa1;
SA *sa2 = new SA;
}

Ответы [ 5 ]

5 голосов
/ 27 августа 2011

Нет никакой (необходимой) разницы в том, как хранятся структуры и как хранятся классы. Фактически, разница only между структурами и классами в C ++ заключается в том, что члены структуры являются открытыми по умолчанию, а члены класса являются закрытыми по умолчанию.

Как и любой другой тип объекта, объект класса или типа структуры имеет длительность хранения , которая определяется тем, как он создан.

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

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

Объект, выделенный оператором new (или вызовом malloc()), существует до тех пор, пока не станет delete d (или free() ed); такие объекты размещаются в «бесплатном магазине», иногда неофициально именуемом «кучей».

3 голосов
/ 27 августа 2011

Код, который реализует классы / структуры (т. Е. Код, который реализует типы ), хранится где-то в сегменте кода.

РЕДАКТИРОВАТЬ:
Как поясняет OP в комментариях, ответ на его вопрос начинается здесь ниже.В вопросе Q была неоднозначность, которая привела к открытию этого ответа.

В зависимости от того, как вы создаете свои объекты, они создаются в динамическом хранилище (freestore), если создаются с помощью malloc, new или создаются в локальном стековом хранилище.

Кроме того, это зависит от того, где создаются объекты.
Глобальные объекты и статические объекты создаются на сегменте данных или сегменте BSS.

AFAIK Стандарт C ++ не упоминает памятьсегменты (кроме freestore (он же куча) и локального хранилища (он же стек)).Так что на самом деле отдых - это деталь реализации.

1 голос
/ 27 августа 2011

afaik, классы / структуры, инициализированные без использования оператора «new», хранятся в стеке, а созданные в «new» - в куче.

0 голосов
/ 27 августа 2011

C ++ имеет три класса выделения: автоматический, динамический и статический, связанные с временем жизни объекта (соответственно, область действия, ручная и постоянная).Как правило, автоматически размещенные объекты реализуются как помещенные в стек, в то время как динамически размещенные объекты попадают в кучу;вместе, стек и куча составляют «сегмент стека» программы.У программы также (как правило) есть «сегмент данных», куда идут статически размещенные объекты - представьте, что статическое распределение происходит во время загрузки, так что память выделяется еще до начала самой программы.Сегмент данных может содержать части только для чтения, где вы можете найти некоторые из ваших строковых констант (поэтому не пишите в них).

Все это, конечно, детали реализации, и ничего из этогопоручено языком.Это просто популярная реализация для настольных платформ.

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

0 голосов
/ 27 августа 2011

Когда классы или структуры создаются автоматически, они сохраняются в стеке. Когда они создаются динамически, они сохраняются в куче.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...