Переменная области действия блока и запись активации

Я понимаю, что локальные переменные (наряду с другими вещами) помещаются в запись активации. И запись активации должна существовать до того, как функция начнет выполняться. Рассмотрим функцию ниже:

void f(void)
{
    int i;
    scanf("%d", &i);
    if (i > 10) {
        int j = 22;
        // do some operations on j here.
    }
    // more code below...
}

Глядя на эту функцию, кажется, что переменная j может существовать или не существовать в зависимости полностью от ввода пользователя во время выполнения. В этом случае,

  1. Будет ли переменная j быть помещены в запись активации?
  2. Определена ли эта реализация (другими словами, будет ли какой-то компилятор генерировать код, эквивалентный j быть объявленным снаружи и над блоком if`)?
  3. Или будет j быть просто размещены в сегменте стека во время выполнения, если это будет необходимо? Но, в таком случае, как будет j выйти из области видимости после if блок?

Я не смог найти много информации об этом в спецификации C11. Заранее спасибо.

1 ответ

Решение

Активация записи также называется стековым фреймом, если я не ошибаюсь. Я считаю, что это ответы:

Q1. Будет ли переменная j помещена в запись активации?

A1: Да, если не оптимизировано компилятором.

Q2. Определена ли эта реализация (другими словами, будет ли какой-то компилятор генерировать код, эквивалентный объявлению j вне и выше блока if`)?

A2: Это определяется реализацией. Зависит от компилятора и настроек компилятора, но в большинстве случаев j будет в записи активации.

Q3. Или просто разместит j в сегменте стека во время выполнения, если это будет необходимо? Но в таком случае как j выйдет из области видимости после блока if?

A3: Нет, распределение в C обычно не зависит от содержимого локальной переменной.

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