Переменные в блоках

Рейтинг: 2Ответов: 1Опубликовано: 11.05.2011

Вот есть такая последовательность объявлений переменных внутри функции

{
    void *out = NULL;

    // ... 
    {
        void *in = NULL;

        // ... 
    }
}

Когда память под переменные out и in размещается на стеке: когда управление входит внутрь функции или когда управление входит внутрь блока, отделенного фигурными скобками? Происходят ли какие-либо изменения со стеком и размещаемыми переменными при пересечении блока?

Ответы

▲ 2

Посмотрим на примере и сделаем переменные volatile, чтобы исключить оптимизации.

int main()
{
    volatile char out = 1;

    {
        volatile char in = -1;

        out += in;
    }

    return out;
}

Собираем и дисассемблируем (gcc, objdump):

8048394:    55                      push   %ebp
8048395:    89 e5                   mov    %esp,%ebp
8048397:    83 ec 10                sub    $0x10,%esp
804839a:    c6 45 ff 01             movb   $0x1,-0x1(%ebp)
804839e:    c6 45 fe ff             movb   $0xff,-0x2(%ebp)
80483a2:    0f b6 45 ff             movzbl -0x1(%ebp),%eax
80483a6:    89 c2                   mov    %eax,%edx
80483a8:    0f b6 45 fe             movzbl -0x2(%ebp),%eax
80483ac:    8d 04 02                lea    (%edx,%eax,1),%eax
80483af:    88 45 ff                mov    %al,-0x1(%ebp)
80483b2:    0f b6 45 ff             movzbl -0x1(%ebp),%eax
80483b6:    0f be c0                movsbl %al,%eax
80483b9:    c9                      leave  
80483ba:    c3                      ret

Если я не ошибаюсь, операции со стеком проводятся при входе в функции, а потом он уже используется либо не используется.