Где хранятся переменные класса? c++

Пусть будет вот такой класс:

class A {
public:
    int a;
    int b;
    float c;
};

Где выделяется память под переменные объектов этого класса, если выделить его: а)без new, б)с оператором new? И если они хранятся в стеке в любом случае, то стоит ли вместо этого выделять переменные через оператор new, если мой класс будет содержать немало переменных и количество объектов класса будет исчисляться сотнями?


Ответы (1 шт):

Автор решения: DmitryK

Переменные объявленные в классе - члены класса. Память выделяется сразу под объект класса, а не под каждый член. В выделенной под объект класса памяти переменные располагаются последовательно в порядке их объявления в классе.
Конкретно в вашем случае объект класса будет занимать ровно столько байт, сколько суммарно занимают переменные.
В общем случае:

  • добавляются указатели на таблицу виртуальных функций (если есть)
  • память занимаемая членами базовых классов (если класс наследуется от кого-то)
  • выравнивание для маленьких типов (зависит от платформы) и др.
    Расположение в памяти зависит от того, где расположен объект этого класса.
A GlobalObject;  // глобальный объект - в памяти программы

void foo(void)
{
    A LocalObject; // локальный объект - на стеке
    A* ptr = new A;  // динамический объект - в куче
    delete ptr;
}

int main()
{  // константные и статические объекты - в памяти программы
  constexpr A ConstObject{ 0, 1, 2.0}; 
  static A StaticObject;
}

Расположение в памяти взаимозависимо с временем жизни объектов.
Не путать с областью видимости.

→ Ссылка