Как компилятор управляет стеком времени выполнения?
На этом сайте есть много вопросов о стеке и куче. Но я хочу знать, как компилятор управляет стеком на самом деле? Распределение на основе стека определяется во время выполнения или во время компиляции? Рассмотрим следующий пример:
#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 представил массивы переменной длины. Они также размещаются в стеке, но их размер определяется во время выполнения. Смотрите это.
Надеюсь, что это ответ на ваш вопрос.
Компилятор принимает решение о выделении среды выполнения в стеке.
Это в основном зависит от системы на самом деле. Компилятор может оценить, сколько памяти ему нужно выделить при компиляции.
Тем не менее, в основном это делается во время выполнения, потому что использование стека сложно оценить, поскольку оно зависит от кода и может варьироваться между запусками в зависимости от пути кода, который программа принимает при исполнении.