Члены класса, выделенного для кучи, автоматически выделяются в куче?

Допустим, у меня есть:

class A{
public:
int x;
int y;
};

И я выделяю экземпляр, например:

A *a = new A();

Распределяются ли a.x и a.y также в куче, поскольку они «зависят» от выделенного объекта кучи?

Спасибо.

2

Решение

Важно понимать, что C ++ использует «семантику копирования». Это означает, что переменные и поля структуры содержат не ссылки на значения, а сами значения.

Когда вы объявляете

struct A
{
int x;
double yarr[20];
};

каждый A вы создадите будет содержать целое число и массив из 20 двойных … например, его размер в байтах будет sizeof(int)+20*sizeof(double) и, возможно, больше по причинам выравнивания.

Когда вы выделяете объект A в куче все эти байты будут в куче, когда вы создаете набор A в стеке все эти байты будут в стеке.

Конечно, структура может содержать также указатель к чему-то другому, и в этом случае указанная память может быть где-то еще … например:

struct B
{
int x;
double *yarr;
};

В этом случае структура B содержит целое число и указатель массиву двойников и размер в памяти для B является sizeof(int)+sizeof(double *) и, возможно, немного больше.
Когда вы выделяете экземпляр B конструктор решит, где память указана yarr будет выделяться из.

Стандартный класс std::vector например, он довольно мал (обычно всего три указателя) и сохраняет все элементы в куче.

3

Другие решения

Вы получите одно выделение в куче, которая содержит x а также y, A это просто хороший способ обратиться к этому объекту.

Хотелось бы, чтобы я легко рисовал на переполнении стека, но вы можете подумать об этом как-то так (очень маленький) пример кучи:

        +-------------------------------+
|            Heap               |
+-------------------------------+
| Other memory here ...         |
+-------+-----------------------+
A *a -> | x | y | Other memory here ... |
+-------+-----------------------+
3

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector