Расположение переменной локального класса

0

Что произойдет, если класс создает все локальные переменные в стеке (т. int i;//An integer в стеке против int *p;//Pointer to an int), а сам экземпляр int *p;//Pointer to an int в куче? Где члены класса? Вот пример:

class A  {
  public:
  int a, b; //These are instantiated on the stack, if the line were written outside a class definition.
  A(int _a, int _b)  { 
    a = _a;
    b = _b;
  }
};

Теперь, если мы создадим A следующим образом:

#include <iostream>
A* classA = new A(1,2);
int main(void)  {
  std::cout << classA.a << "\t" << classA.b << endl;
  return 0;
}

Где classA.a и classA.b? Являются ли они в стеке программ? Являются ли они автоматически помещены в кучу, а classA?

Не проблема в большинстве случаев, я бы не подумал, но было бы полезно узнать...

  • 0
    a и b не являются локальными переменными, они являются членами класса.
  • 0
    @JonathanPotter Хорошо, я заменил локальные переменные членами класса. Кстати, какая разница, кроме соглашения об именах? Моя книга по С ++ говорит, что локальные переменные и члены класса взаимозаменяемы ...
Теги:
oop
memory-management

3 ответа

4

int a, b;//These are instantiated on the stack,

Нет, они не создаются в стеке. Переменные-члены являются частями структуры данных экземпляра и поэтому распределяются в одном куске памяти как экземпляр класса. Только если экземпляр класса находится в стеке, тогда также имеются поля экземпляра.

1

Эта строка фактически неверна

  int a, b; //These are instantiated on the stack, normally

Это зависит от того, как создается объект - с использованием new или в стеке

  • 0
    Я думаю, что ошибка в ясности. Я не передал то, что имел в виду правильно. если int a, b; был написан вне класса, тогда они будут созданы в программном стеке. Я уточню это в редактировании.
0

Класс - это определение структуры данных; блок памяти. Он не определяет, откуда этот блок памяти. Однако вся память для одного объекта происходит из одного и того же места.

 static Class A ;

Выделяет все данные для A в разделе программы стека.

. . . . . 
{
    Class A ;
}

Выделяет ВСЕ данные для A в стеке (или любой используемый механизм --- стек).

Class *A = new A ;

Выделяет все данные для A в динамической памяти.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню