Как компилятор управляет стеком времени выполнения?

На этом сайте есть много вопросов о стеке и куче. Но я хочу знать, как компилятор управляет стеком на самом деле? Распределение на основе стека определяется во время выполнения или во время компиляции? Рассмотрим следующий пример:

#include <iostream>
using namespace std;
class Test {
 // Test class' data members
 public:
 // member functions
};
int main() {
  Test t; // automatic object
  // use t here
  return 0;
}

Вопрос здесь в том, когда будет выделен объект t? память будет выделена во время компиляции или во время выполнения? Я знаю, что локальные переменные, объекты выделяются, когда функция вызывается и уничтожается, когда функция завершается.

3 ответа

Решение

Распределение на основе стека определяется во время компиляции и выполняется во время выполнения. Когда компилятор "видит" объявление Test t, он генерирует код для выделения sizeof(Test) байтов в стеке для t и опционально для вызова его ctor. Когда функция завершается, компилятор генерирует код для вызова dtor (если он существует) и освобождения пространства.

Тем не менее, C99 представил массивы переменной длины. Они также размещаются в стеке, но их размер определяется во время выполнения. Смотрите это.

Надеюсь, что это ответ на ваш вопрос.

Компилятор принимает решение о выделении среды выполнения в стеке.

Это в основном зависит от системы на самом деле. Компилятор может оценить, сколько памяти ему нужно выделить при компиляции.

Тем не менее, в основном это делается во время выполнения, потому что использование стека сложно оценить, поскольку оно зависит от кода и может варьироваться между запусками в зависимости от пути кода, который программа принимает при исполнении.

Другие вопросы по тегам