Сжатие и расширение стека - PullRequest
       4

Сжатие и расширение стека

1 голос
/ 05 октября 2019

Я хочу изучить сжатие / расширение стека на основе объявлений локальных переменных и вызова функции. Для этого сначала я использовал следующий код C ++ в стиле C -

#include <stdio.h>

void MyFunc()
{
    int k = 3;
    printf("%d: %p\n", k, &k);
}

int main()
{
    int i = 1;
    printf("%d: %p\n", i, &i);

    int j = 2;
    printf("%d: %p\n", j, &j);

    MyFunc();

    int l = 4;
    printf("%d: %p\n", l, &l);

    return 0;
}

Компиляция с использованием clang - clang -o outputs/Example2.out Example2.cpp привела к следующему выводу -

1: 0x7ffd216a8818
2: 0x7ffd216a8814
3: 0x7ffd216a87ec
4: 0x7ffd216a8810

На основеобъяснение (здесь) [ Стек растет вверх или вниз? , вывод имеет смысл. Когда мы выделяем новую локальную переменную j, адрес стека уменьшается на 0x4. Аналогичным образом, когда вызывается функция, происходит большее уменьшение адреса между выходами 2 и 3. И, наконец, когда функция возвращается, происходит расширение адреса (между 3 и 4).

Но,если я использую библиотеку iostream для вывода переменных и их адресов (и компилирую с использованием g++, я, кажется, получаю некоторые расхождения) -

#include <iostream>

void MyFunc()
{
    int k = 3;
    std::cout << k << ": " << &k << "\n";
}

int main()
{
    int i = 1;
    std::cout << i << ": " << &i << "\n";

    int j = 2;
    std::cout << j << ": " << &j << "\n";

    MyFunc();

    int l = 4;
    std::cout << l << ": " << &l << "\n";

    return 0;
}

Компиляция с использованием - g++ -Wall -Werror -o outputs/Example.out Example.cpp, приводит к следующемуoutput -

1: 0x7ffda2bb7fdc
2: 0x7ffda2bb7fe0
3: 0x7ffda2bb7fb4
4: 0x7ffda2bb7fe4

В этом случае мы видим, что стек расширился на 0x4 с 1 до 2 (т.е. когда было объявлено j). Однако во время вызова функции адрес сократился (с выхода 2 на 3 по 0x2c). Основываясь на ответе (здесь) [ Увеличивается ли стек вверх или вниз? , я понимаю, что стек увеличивается либо вверх, либо вниз в зависимости от архитектуры.
В первом случае стек сокращается во время локальногораспределение переменных / вызов функции. Но здесь стек расширяется при объявлении локальной переменной, но сжимается при вызове функции.

Есть ли объяснение этому?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...