Я хочу изучить сжатие / расширение стека на основе объявлений локальных переменных и вызова функции. Для этого сначала я использовал следующий код 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). Основываясь на ответе (здесь) [ Увеличивается ли стек вверх или вниз? , я понимаю, что стек увеличивается либо вверх, либо вниз в зависимости от архитектуры.
В первом случае стек сокращается во время локальногораспределение переменных / вызов функции. Но здесь стек расширяется при объявлении локальной переменной, но сжимается при вызове функции.
Есть ли объяснение этому?