Допустим, у меня есть:
class A{
public:
int x;
int y;
};
И я выделяю экземпляр, например:
A *a = new A();
Распределяются ли a.x и a.y также в куче, поскольку они «зависят» от выделенного объекта кучи?
Спасибо.
Важно понимать, что 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
например, он довольно мал (обычно всего три указателя) и сохраняет все элементы в куче.
Вы получите одно выделение в куче, которая содержит x
а также y
, A
это просто хороший способ обратиться к этому объекту.
Хотелось бы, чтобы я легко рисовал на переполнении стека, но вы можете подумать об этом как-то так (очень маленький) пример кучи:
+-------------------------------+
| Heap |
+-------------------------------+
| Other memory here ... |
+-------+-----------------------+
A *a -> | x | y | Other memory here ... |
+-------+-----------------------+