iampradeepsharma Ответов: 4

Когда память зарезервирована для объекта переменной или класса ?


Всем привет,

Я не знаю, когда на самом деле память выделяется для переменной .
Несколько вопросов, как показано ниже :

1. когда память, выделенная простому примитивному типу данных, говорит int .
2. когда происходит выделение меоморы объекту класса .

Что я уже пробовал:

Я искал в сети, но есть расхождения во мнениях .

4 Ответов

Рейтинг:
4

Richard MacCutchan

Он выделяется, когда вы запрашиваете его создание. Для простой переменной это означает, когда она объявлена. Для объекта класса, когда он объявлен или создан с помощью new как показывает Карстен выше.


Рейтинг:
28

Jochen Arndt

Существуют различные виды складских помещений:

  1. Текст: содержит исполняемый код (названный здесь для полноты картины)
  2. Инициализированные данные: глобальные и статические переменные
  3. Неинициализированные данные: глобальные и статические переменные (инициализируются до нуля при запуске приложения)
  4. Стек: локальные переменные
  5. Куча: выделенное хранилище с использованием new() или malloc()
Память для первых двух типов является частью самого исполняемого файла и выделяется операционной системой при загрузке приложения в память.

Память для неинициализированных глобальных данных также выделяется операционной системой и инициализируется до нуля.

Память стека выделяется операционной системой при запуске потока. Для основного потока размер определяется из исполняемого файла. Другие потоки, созданные во время выполнения, будут использовать тот же размер, что и значение по умолчанию, но другой размер может быть передан в качестве параметра функции создания потока.

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

Компилятор может также решить хранить локальные переменные в регистрах процессора вместо стека. Это также может быть предложено с помощью register ключевое слово.

Кучная память выделяется кусками во время выполнения. Это делается с помощью кода, вставляемого компилятором в каждое приложение (вызывается менеджер кучиЕсли запрос на память не может быть выполнен из текущей памяти кучи, диспетчер кучи запросит у операционной системы больший блок памяти.

Как правило, нет никакой разницы между выделением памяти или назначением базовых и сложных типов (кроме того, компилятор может хранить базовые типы в регистрах, а не в стеке).

Примеры:
// Initialised global data
int global1 = 1;
static int global2 = 2;

// Uninitialised global data (will be set to zero)
int global1U;
static int* globalPtr;

void some_func()
{
    // Initialised static data
    static int localS1 = 1;

    // Uninitialised static data
    static int localS2;

    // Local variables on the stack
    // The compiler might store some of them in CPU registers
    int local1;
    int local2 = 2;
    int localArr[10];
    SomeObj obj;

    // Local variable stored in CPU register
    // Deprecated with C++17 and the compiler may ignore it (use the stack instead)
    register r = 0;

    // Heap memory where the pointer is stored as local variable
    int *localPtr = new int[10];
    SomeObj *objPtr = new SomeObj();
    
    // Heap memory where the pointer is stored in a global variable
    globalPtr = new int[10];


}


Рейтинг:
2

CPallini

Выделение памяти на самом деле очень большое C++ тема. Вы можете начать читать учебник, см., например Учебник По C++: Распределение Памяти - 2018[^], а затем изучить его на хорошем C++ книга. Потому что, как C++ разработчик, вы должны овладеть им.


iampradeepsharma

спасибо

Рейтинг:
0

KarstenK

Память элемента выделяется при создании объекта. Большая разница заключается в указателях, это всего лишь простые числовые значения.

Object obj;//memory of an Object instance
Object *p = 0;//only a pointer (long) allocated
p = new Object();//Object allocated and pointer set 

Вы можете попробовать это, войдя в код с помощью отладчика.